Asp.net-Mvc

MVC 2 區域註冊路由順序

  • April 24, 2012

我注意到在 MVC 2 Preview 2 中,AreaRegistration 以任意順序載入每個區域的路由。有沒有一種好方法可以讓一個先於另一個?

例如,我有兩個區域——“站點”和“管理員”。兩者都有一個“部落格”控制器。

我想要以下內容:

/admin/ --> go to Admin's Blog controller
/       --> go to Site's Blog controller. 

問題是它首先載入站點的路由,所以它是匹配的,{controller}/{action}/{id}而不是admin/{controller}/{action}/{id}當我轉到 url“/admin/”時。然後我得到一個 404,因為“站點”區域中沒有管理控制器。

這兩個區域都預設為“部落格”控制器。我意識到我可以簡單地把site/{controller}/...它作為 url,但如果可能的話,我寧願把它放在根目錄。我還嘗試在全域 RegisterRoutes 函式中保留預設路由,但是,它不會發送到“站點”區域。

提前致謝!

目前無法訂購區域。但是,我認為嘗試使每個區域盡可能獨立於其他區域是有意義的,因此順序無關緊要。

例如,可以不使用預設的 {controller}/{action}/{id} 路由,而是將其替換為每個控制器的特定路由。或者向該預設路由添加約束。

我們正在考慮允許訂購的選項,但我們不想使該功能過於復雜。

除了 Haacked 所說的,很可能訂購區域註冊(以及它們的路線)。您所要做的就是按照您想要的任何順序手動註冊每個區域。它不像呼叫 RegisterAllAreas() 那樣簡潔,但絕對可行。

protected void Application_Start() {
   var area1reg = new Area1AreaRegistration();
   var area1context = new AreaRegistrationContext(area1reg.AreaName, RouteTable.Routes);
   area1reg.RegisterArea(area1context);

   var area2reg = new Area2AreaRegistration();
   var area2context = new AreaRegistrationContext(area2reg.AreaName, RouteTable.Routes);
   area2reg.RegisterArea(area2context);

   var area3reg = new Area3AreaRegistration();
   var area3context = new AreaRegistrationContext(area3reg.AreaName, RouteTable.Routes);
   area3reg.RegisterArea(area3context);
}

另一種選擇是獲取 RegisterAllAreas() 的程式碼,將其複製到您自己的應用程序中,並建構您自己的機制來確定順序。如果您想要內置方法所做的所有花哨的記憶體邏輯,則需要複製大量程式碼,但您的應用程序甚至可能不需要。

引用自:https://stackoverflow.com/questions/1639971