ASP.NET MVC的路由
好久沒寫博文了,感覺最近好像少了點動力。唉!這回就看看這個MVC的路由。
說這個路由機制其實不是MVC里面特有的,ASP.NET里面本身就有的,只不過在WebForm里面一般比較少用,而在MVC里就是把原本的路由擴展了。原本對不知道單純在ASP.NET里使用路由的詳細情況,但自從看了蔣金楠老師的幾篇文章之后知曉了,不過這篇還是講MVC的路由而已。
路由的定義是位于根目錄下的全局文件Global.asax.cs。里面有個RegisterRoutes方法
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute( 6 "Default", // Route name 7 "{controller}/{action}/{id}", // URL with parameters 8 new { controller = "System", action = "TestPage", id = UrlParameter.Optional } // Parameter defaults 9 ); 10 }這里有兩部分,一部分是
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");這個是用于忽略路由的,按上面的情況,則是不對asd文件經行路由,可以直接去訪問。
1 routes.MapRoute( 2 "Default", // Route name 3 "{controller}/{action}/{id}", // URL with parameters 4 new { controller = "System", action = "TestPage", id = UrlParameter.Optional } // Parameter defaults 5 );?
這個是定義路由的。根據上面的注釋,可以看出第一個參數是定義了路由的名稱;第二個則是URL的參數;第三個則是URL參數的默認值。除此外還可以對URL的參數進行某些約束,設置命名空間等。關于MapRoute的其他重載如下
1 public static Route MapRoute(this RouteCollection routes, string name, string url); 2 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults); 3 public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces); 4 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints); 5 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces); 6 public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);?
另外,各個路由的名稱一定要唯一的,不能重復。
URL參數中{Controller}和{action}是兩個比較特殊的占位符,分別代表著請求對應的控制器和行為方法。在后面跟著的參數則是傳到行為方法里面的參數,在這里聲明的是{id},方法的參數名一定是id才能獲取到參數,否則傳到方法里面的參數值是null。如果在參數名前面帶一個星號(*),如{*id},這樣就會匹配URL后面所有的剩余的參數。
對于上面這個路由的定義,接收到以下請求時,參數的匹配如下
| 請求URL | 參數 | 備注 |
| http://localhost:1345/System/TestPage | Controller=System Action=TestPage | 調用SystemController下的TestPage方法 |
| http://localhost:1345/Customer/Login | Controller=Customer Action=Login | 調用CustomerController下的Login方法,id參數為空 |
| http://localhost:1345/Customer/Login/1 | Controller=Customer Action=Login Id=1 | 調用CustomerController下的Login方法,id參數為1 |
| http://localhost:1345 | Controller=null Action=null | 默認調用SystemController下的TestPage方法 |
| http://localhost:1345/System | Controller=System Action=null | 訪問SystemController,默認調用TestPage方法 |
在這里另外推薦一個好東西專門用于測試路由的好東西,RouteDebug,這個需要額外引用一個dll,叫RouteDebug.dll(可在網上找一下),然后在全局文件Global.asax.cs里面的Application_Start()方法里加多一行代碼
RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);?
打開瀏覽器輸入相應的URL,則會出現一下頁面
從這個頁面可以知道當前的URL跟那個路由匹配了,還有與當前路由列表中其他路由的匹配情況。除此之外,能獲取到當前請求的URL,匹配的各個參數,還有各個路由在路由集合的順序等等。
在這個例子中我還定義了另一個路由
1 routes.MapRoute( 2 "MyRoute1", 3 "Customer/{action}/{id}", 4 new { controller = "Customer", action = "Login", id = -1 });?
從上面路由集合的順序可以看出,這個路由的順序要比默認路由{Controller}/{action}/{*id}有前。如果這個路由放在默認路由前面,則這個MyRoute1路由則起不了作用,可以用“~/Customer”測試。
轉載于:https://www.cnblogs.com/HopeGi/p/3168556.html
總結
以上是生活随笔為你收集整理的ASP.NET MVC的路由的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工具 | Procexp工具使用及案例说
- 下一篇: ASP.NET AJAX(服务器回调)