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

时间:2013-03-08 18:22:03

标签: asp.net-mvc asp.net-mvc-4

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

我想为促销原因添加友好的网址,例如:

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 个答案:

答案 0 :(得分:1)

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

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());
    }
}

答案 1 :(得分:0)

是的,这是可能的。

您只需在主控制器中检查索引操作方法,查看产品表中是否存在提供的产品。如果是,则返回该产品的视图,否则,只返回索引视图。

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

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

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

如果它们遵循某种模式,您可以通过使用正则表达式添加约束来添加将处理这些促销的新路由。