1

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

出于促销原因,我想添加友好的 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

是否可以?

谢谢!

4

2 回答 2

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());
    }
}
于 2013-03-09T14:47:35.893 回答
0

是的,有可能。

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

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

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

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

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

于 2013-03-08T18:48:07.433 回答