0

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

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

我的操作方法是:

 [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

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

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

有任何想法吗?

4

1 回答 1

0

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

破坏你的 url 会发生什么是路由"{productId}"首先匹配,所以你所有的路由参数都被添加为查询字符串值。要解决此问题,请执行以下操作:

[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 生成。如果只有 a、b 和 c,则将使用第二个,等等......

于 2013-02-18T17:38:39.197 回答