首先了解下流程



路由源碼可參考
https://referencesource.microsoft.com/#System.Web/Routing/UrlRoutingModule.cs,9b4115ad16e4f4a1
代碼實際舉例
配置路由
在App_Start文件下,新建RouteConfig.cs文件里配置路由信息。通過靜態方法RouteCollection.MapRoute()配置路由信息。
如:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//忽略該模式的URL routes.MapRoute( name: "Default",//路由名稱 url: "{controller}/{action}/{id}",//路由模板 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }//路由默認值,參數id可以為空 ); } }
-
name:為該路由名稱
-
url:為路由模板,
{}是占位符。 -
defaults:為路由默認值
示例

路由順序和優先級
路由引擎在定位路由時,會遍歷路由集合中的所有路由。只要發現了一個匹配的路由,會立即停止搜索。所以定義路由一定要注意路由的先后循序。一般是越是精確的放在前面。
如:有一個如下的路由配置
routes.MapRoute{ name: "one", url:"{site}", defaults:new{controller="MyControllerOne",action="Index"} } routes.MapRoute{ name:"two", url:"Admin", defaults:new {controller="Admin",action="Index"} }
第一個路由有一個{site}占位符。默認的控制器為MyControllerOne。第二個路由是一個常量Admin,默認的控制器為Admin。這兩個都是正確的路由配置。但是當我們輸入urlxxx.com/admin時,我們預想的是請求AdminController下的Index操作方法。但是根據上面的路由映射,該url會匹配第一個路由,然后就停止了路由查找。此時觸發的Controller為MyControllerOne。
路由約束
之前的路由配置,都沒有url的參數的類型信息。如果我們的Action是一個Int類型,但是url中的參數是個字符串,這樣就會導致錯誤。所以如果有url的類型約束可以規避這個錯誤的發生。
在Asp.Net MVC中我們可以通過正則表達式來約束路由。
如:
routes.MapRoute{ "Default", "{controller}/{action}/{id}", new{controller="Home",action="Index",id=UrlParameter.Optional}, new{id="\d+"}//該id為整數 }
除了使用正則表達式來約束路由,我們還可以通過繼承IRouteConstraint接口自定義約束規則
如:
public class MyRouteConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { //獲取id的值 var id = values[parameterName]; //id驗證方法 return true; } }
更新路由配置
routes.MapRoute{ "Default", "{controller}/{action}/{id}", new{controller="Home",action="Index",id=UrlParameter.Optional}, new{id=new MyRouteConstraint()} }
