我們都知道調用ASP.NET MVC的某些API函數(諸如:Url.Action、RedirectToAction等)可以生成URL,ASP.NET MVC會根據調用API函數時傳入的參數去匹配系統定義的路由(Route),然后通過匹配成功的路由去生成相應的URL。
ASP.NET MVC會依次根據如下三個規則生成URL:
-
調用ASP.NET MVC API函數時傳入的參數信息
-
當前請求的URL(就是Request.Url)和系統中定義路由匹配(按照路由表定義的順序,從上往下匹配)后的匹配值
-
系統定義路由中路由參數的默認值
下面這篇文章通過一個例子來闡述ASP.NET MVC是怎么通過上面三點來生成URL。
首先我們在MVC系統中定義了如下兩個路由
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Lang", url: "Culture/{lang}/{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = 123 } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
運行ASP.NET MVC項目時,如果我們在瀏覽器地址欄上輸入地址http://localhost/culture/en-us/Home/Index,那么這個地址會匹配上面第一個路由Lang(因為ASP.NET MVC的路由表是從上往下匹配的,如果某個路由匹配成功就不會再往下匹配了)。
如果我們現在在http://localhost/culture/en-us/Home/Index這個地址運行的View上(也就是HomeController下的Index這個View),調用Url.Action生成URL:
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> @Url.Action("DoSomething") </div> </body> </html>
那么我們來看看調用API時,ASP.NET MVC生成URL的步驟:
1.由於在調用API Url.Action時傳入了參數DoSomething,所以路由中可以得到參數Action為DoSomething。
Action:DoSomething
2.當前請求的URL是http://localhost/culture/en-us/Home/Index,那么用這個地址從上往下去匹配系統定義的路由,匹配到第一個路由Lang時我們可以得到兩個參數信息,Controller為Home,lang為en-us,那么現在我們得到的路由信息有:
Controller:HomeController
Action:DoSomething
lang:en-us
3.由於路由Lang中,我們定義了參數id有默認值123,所以最后我們得到的路由信息如下:
Controller:HomeController
Action:DoSomething
lang:en-us
id:123
現在根據最后得到的路由信息再去從上到下匹配系統定義的路由,那么首先匹配到路由Lang時,MVC發現Lang中每個路由參數現在都有值了,匹配成功,所以根據Lang生成的URL就如下圖所示(注意:參數id由於是路由Lang中定義的默認值,所以最后沒有在生成的URL中體現出來)