ASP.NET MVC API 路由生成規則


我們都知道調用ASP.NET MVC的某些API函數(諸如:Url.Action、RedirectToAction等)可以生成URL,ASP.NET MVC會根據調用API函數時傳入的參數去匹配系統定義的路由(Route),然后通過匹配成功的路由去生成相應的URL。

 

ASP.NET MVC會依次根據如下三個規則生成URL:

  1. 調用ASP.NET MVC API函數時傳入的參數信息

  2. 當前請求的URL(就是Request.Url)和系統中定義路由匹配(按照路由表定義的順序,從上往下匹配)后的匹配值

  3. 系統定義路由中路由參數的默認值

 

下面這篇文章通過一個例子來闡述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中體現出來)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM