因此,我正在使用AreaRegistration將區域切換到使用屬性路由。我遇到了一個問題,這似乎是由路由加載到路由表中的順序造成的。我通過最後加載有問題的路由來解決了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()]
件裝飾它們。
看看http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#order –
謝謝你,阿米爾。看起來,RouteOrder屬性可用於ApiController類...在特定版本的Web API控制器中。但是,它不適用於從'System.Web.Mvc.Controller'類繼承的控制器,這是我遇到問題的地方。因爲ApiController在MVC5中沒有RouteOrder參數(加上,這會打斷控制器),所以將控制器的繼承改爲'System.Web.Http.ApiController'也沒有幫助。 –
聽起來像你可能不在ASP.NET MVC 5.我認爲屬性路由僅在5中引入。http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing- in-asp-net-mvc-5.aspx –