【发布时间】:2016-01-14 07:23:49
【问题描述】:
所以,我正在将一个区域从使用 AreaRegistration 切换到使用 Attribute Routing。我遇到了一个问题,这似乎是由将路由加载到路由表中的顺序引起的。我通过最后加载有问题的路由解决了 AreaRegistration 中的问题,这样只有当所有其他路由不匹配时,该路由才会匹配。使用属性路由,这似乎是不可能的。我在创建路由时有 Order 参数,但这不会影响事物如何到达路由表,除非非常狭窄。
这是我在 AreaRegistration 文件中的路线:
context.MapRoute(
name: "ActionItems_home",
url: "ActionItems/{group}/{statuses}/{overdueOnly}",
defaults: new { controller = "Home", action = "Index", group = "All", statuses = "New,Open", overdueOnly = false },
namespaces: new string[] { "IssueTracker.Areas.ActionItems.Controllers" }
);
现在,当我尝试将其切换到属性路由时,唯一接近工作的是:
[Route("", Order = 4)]
[Route("{group:regex(^(?!Item|DecisionLogs))?}", Order = 3)]
[Route("{group:regex(^(?!Item|DecisionLogs))}/{statuses=New,Open?}", Order = 2)]
[Route("{group:regex(^(?!Item|DecisionLogs))}/{statuses=New,Open}/{overdueOnly:bool=false?}", Order = 1)]
请注意,我必须输入正则表达式,否则不会调用 Item 控制器 - 相反,我最终将字符串“Item”作为 group 参数传入。但是正则表达式对于 URL 的最终呈现方式并没有特别的帮助。
我希望 喜欢 在 URL 中抑制可选参数,除非它们是非默认的。我尝试将参数指定为可选的、具有默认值的、可选的和具有默认值的。他们似乎都没有真正做到这一点。
当前的解决方案至少提供了一个没有查询字符串的 URL,但它们包含可选参数并使事情变得丑陋。目前,我只是将那些令人震惊的路线留在了AreaRegistration 文件中,而不是用[Route()] 片段来装饰它们。
【问题讨论】:
-
谢谢你,阿米尔。似乎 RouteOrder 属性可用于 ApiController 类......在某些版本的 Web API 控制器中。但是,它不适用于从
System.Web.Mvc.Controller类继承的控制器,这是我遇到问题的地方。将我的控制器的继承更改为System.Web.Http.ApiController也无济于事,因为 ApiController 在 MVC5 中没有 RouteOrder 参数(另外,这会破坏控制器)。 -
听起来你可能不在 ASP.NET MVC 5 上。我认为属性路由是在 5 中才引入的。blogs.msdn.com/b/webdev/archive/2013/10/17/…
-
不——我在 MVC5 上,属性路由在大多数情况下都非常有效。只有这些带有一堆可选参数的路由会变得很麻烦。
-
这可能会有所帮助,它有点旧,但应该是一本好书,有点反思,你可以自己滚动blog.stevensanderson.com/2008/07/31/…
标签: c# asp.net-mvc routing asp.net-mvc-5 attributerouting