ASP.NET MVC 區域:如何在 URL 中隱藏“區域”名稱?
執行具有部落格區域和部落格控制器的MVC 2 區域範例時,URL 如下所示:
http://localhost:50526/Blog/Blog/ShowRecent格式:
RootUrl / AreaName / ControllerName / ActionName
剛剛發現 MVC 區域,這似乎是一種組織程式碼的好方法,即為每個部分創建一個區域,在我的例子中,每個部分都有自己的控制器。這意味著每個 AreaName = ControllerName。這樣的效果就是Url中的雙AreaName/ControllerName路徑如上面的**/Blog/Blog/**
對路由沒有完全清楚的了解,如何設置路由以不顯示 AreaName?
編輯:
我正在嘗試減少路由的工作量,因為它們似乎會相互影響(即需要特定的排序)並且可能會引起嚴重的頭痛 :-) 在將現有的 webform 應用程序轉換為 MVC 時,我已經轉換了幾個核心部分,它們每個都有一個控制器和相當數量的視圖/操作,儘管大多數數據訪問是程式碼在程序集中,但模型/視圖數據類的數量正在增長……我目前正在根模型/視圖中創建子文件夾這些部分(或區域)的文件夾,並希望創建區域能夠以相同的方式工作,除了組織程式碼(使用覆蓋區域的基本路線)對此有何評論?
在每個區域的文件夾中,您會看到一個
*AreaName*AreaRegistration.cs文件。這是儲存區域路由規則的地方。預設情況下,當它們生成時,它們將在其他所有內容之前包含區域名稱。問題是:如果您從路由中刪除區域名稱“文件夾”,該路由將擷取所有“標準”{controller}/{ action}/{id} 請求。這顯然不是你想要的..為了克服這個問題,您可以根據該路由中存在的控制器名稱在路由上添加正則表達式過濾器。缺點?您將無法在應用程序中擁有兩個具有相同名稱的控制器(至少不使用標準路由..您總是可以想到不同的路由來訪問它們:))
最後..有這個結構:
/Areas
/Areas/Blog/Controllers/BlogController.cs
/Areas/Blog/Controllers/FeedController.cs
/Areas/User/Controllers/UserController.cs
/Controllers/PageController.cs
你應該擁有的是這樣的:在 BlogAreaRegistration.cs 中:
context.MapRoute( "Blog_default", "{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional }, new { controller = "(Blog|Feed)" } );在 UserAreaRegistration.cs 中:
context.MapRoute( "User_default", "{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional }, new { controller = "(User)" } );在 Global.asax.cs 中:
public static void RegisterRoutes(RouteCollection routes) { context.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); }請注意,在 global.asax 地區註冊是第一位的!:)
UPD: 根據您的問題更新:如果您將使用區域,您必須考慮一件事:如果您有區域間連結,您還必須在連結中提供區域名稱. 例如
<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %>你明白了。
關於多個模型/視圖,目前我正在遵循這樣的結構
/Code/ // 助手,未移動到庫的擴展類
/Models/Data/ // EF 類 + 驗證類在這裡
/Models/ViewModels/{controller}/ // 查看每個控制器儲存的模型
到目前為止,它執行良好,並且我設法使解決方案保持相對有條理。正如我所說,到目前為止我創建的唯一區域是該
Admin區域,因為它與網站的其他部分有很大不同:)