属性路由的异常行为

时间:2013-02-17 21:25:35

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

我正在使用属性路由并发现它非常好。特别是我可以将我的路线本地化在许多不同的文化中。

我遇到了一个不规则发生的问题 - 它有时发生而不是其他问题,我找不到模式。

我的行动方法是:

 [GET("/")]
    [GET("{productId:int}")]
    [GET("{category2Id:int},{productId:int}/{category2Slug}/{productSlug}")]
    [GET("{category2Id:int},{category3Id:int},{productId:int}/{category2Slug}/{category3Slug}/{productSlug}")]
    [GET("{category2Id:int},{category3Id:int},{category4Id:int},{productId:int}/{category2Slug}/{category3Slug}/{category4Slug}/{productSlug}")]
    public virtual ActionResult Index(int productId, string productSlug = null, string category2Slug = null, string category3Slug = null, string category4Slug = null, int? category2Id = null, int? category4Id = null, int? category4Id= null)

我的控制器上装饰了以下内容

[SessionState(SessionStateBehavior.Disabled)]
[RoutePrefix("product", TranslationKey = "product")]
public partial class ProductController

问题是有时属性渲染会生成正确的URL,例如。 https://localhost/product/22,33,999/cat2/cat3/product-name但主要是生成:https://localhost/product/999/?productSlug=product-name&category2Slug=cat2&category3Slug=cat3&category2Id=22&category3Id=33

知道为什么会发生这种情况并且控制器操作参数被添加为查询字符串参数而不是网址的一部分?

我正在研究用C#开发的mvc4应用程序,其属性路由版本为3.4.2.0。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您需要正确订购路线。如你所知,无法保证5条路线中的哪条路线首先出现。您可以访问routes.axd确认。

启动你的网址会发生什么事情是首先匹配路由"{productId}",所以你的所有路由参数都被添加为查询字符串值。要解决这个问题,请执行la:

[GET("product/{a}/{b}/{c}/{d}", ActionPrecedence = 1)]
[GET("product/{a}/{b}/{c}", ActionPrecedence = 2)]
[GET("product/{a}/{b}", ActionPrecedence = 3)]
[GET("product/{a}", ActionPrecedence = 4)]
[GET("product", ActionPrecedence = 5)]

这可以通过从最具体到最少的顺序排序来帮助生成URL。如果您提供a,b,c和d,则第一条路线将用于URL gen。如果只有a,b和c,那么第二个将被使用,等等....