代码之家  ›  专栏  ›  技术社区  ›  New Dev

MVC路由-参数和控制器名称之间的冲突

  •  1
  • New Dev  · 技术社区  · 13 年前

    如何在不明确连接以下路由规则的情况下解决这些规则?

    出于促销原因,我想添加友好的URL,如下所示:

    domain.com/promoA
    domain.com/promoB
    

    这些应该由一个“促销”管理员来处理。(我不介意这是否由“家庭”控制器处理)

    然后,我想将以下形式的URL直接映射到控制器

    domain.com/account       ---> controller=account, action=index
    domain.com/account/login ---> controller=account, action=login
    domain.com/product/list  ---> controller=product, action=list
    domain.com               ---> controller=home, action=index
    

    有可能吗?

    谢谢

    2 回复  |  直到 13 年前
        1
  •  1
  •   bmavity    13 年前

    我不确定这是否是最简单的方法,但你可以设置一条有约束的路线。只要确保在其他路线之前申报即可。

    routes.MapRoute(
        "Promos", // Route name
        "{action}", // URL with parameters
        new { controller = "Promotions", }, // Parameter defaults
        new { action = new PromoConstraint(), }
    );
    

    PromoConstraint定义为

    public class PromoConstraint : IRouteConstraint
    {
        private readonly List<string> _promos = new List<string> { "promoA", "promoB", }; 
    
        public bool Match(
            HttpContextBase httpContext
            , Route route
            , string parameterName
            , RouteValueDictionary values
            , RouteDirection routeDirection
        )   {
            object value;
            if(!values.TryGetValue(parameterName, out value)) return false;
    
            var str = value as string;
            if(str == null) return false;
    
            return _promos.Any(promo => promo.ToLower() == str.ToLower());
        }
    }
    
        2
  •  0
  •   Andy T    13 年前

    是的,这是可能的。

    您所要做的就是在主控制器中使用Index操作方法检查产品表中是否存在所提供的产品。如果是,则返回该产品的视图,否则,只返回索引视图。

    您需要为所有其他控制器设置路由,就像您在问题中描述的那样。

    您的根路由需要指定它将采用一个可选的“product”参数。

    routes.MapRoute("Root",   "{product}",   new { controller = "Home", action = "Index", product = "" });
    

    如果他们遵循某种模式,你可以添加一个新的路线,通过使用正则表达式添加约束来处理这些促销。