2013-03-08 120 views
1

如何解决以下路由规则而不明确地将它们连接起来?MVC路由 - 参数和控制器名称之间的冲突

我想补充友好的URL推广的原因,像这样:

domain.com/promoA 
domain.com/promoB 

这些应该由单一的“促销活动”控制器处理。 (如果这是由“家”控制器处理我不介意)

然后,我想有直接映射到控制器

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 

下面的表格是有可能的网址吗?

谢谢!

+0

将您的宣传片总是有一个像'/宣传{}的东西'的网址是什么?即你可以正则表达吗? – Charlino 2013-03-08 18:54:37

+0

@Charlino - 不,他们没有。这只是一个例子。 – 2013-03-08 21:08:45

+0

@BhushanFrake ...你知道,这是一个公平的问题。我在脑海中分析它,并没有真正尝试任何东西,从而瘫痪了。 : -/ – 2013-03-08 21:10:35

回答

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

这看起来像是正确的方法。我会尝试一下。谢谢!!! – 2013-03-09 22:11:32

0

是的,这是可能的。

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

您需要为所有其他控制器设置路由,如您在问题中所述。

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

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

如果他们遵循一定的模式,你可以添加,将通过使用正则表达式添加约束处理这些宣传片的新路线。

+0

不幸的是,它们没有遵循任何特定的模式。我想避免为我的所有控制器设置显式路由。如果控制器存在,是否有办法让MVC只匹配通往{controller}的路径? – 2013-03-08 21:16:06

相关问题