首先看一下命名路由和沒有命名的差別:
命名路由:
routes.MapRoute( name: "Test", // Route name url: "code/p/{action}/{id}", // URL with parameters defaults: new { controller = "Section", action = "Index", id = UrlParameter.Optional } // Parameter defaults );
默認路由:
routes.MapRoute( Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
ASP.NET 中的路由機制沒有要求路由具有名稱,而且大多數情況下沒有名稱的路由也能滿足大多數應用場合。通常情況下,為了生成一個URL(統一資源定位符),只需要抓取事先已經定義好的路由值,並把他們交給路由引擎,剩下的就有路由引擎來處理,正如我們要介紹的,在有些情況下,使用這種方法在選擇生成URL的路由時會可能產生二義性。但給路由命名卻可以解決這個問題。
查看本欄目
下面我們注冊兩個路由:
routes.MapRoute( name: "Test", // Route name url: "code/p/{action}/{id}", // URL with parameters defaults: new { controller = "Section", action = "Index", id = UrlParameter.Optional } ); routes.MapRoute( name:"Default", // Route name url:"{controller}/{action}/{id}", // URL with parameters defaults:new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
為了在視圖中生成一個指向每個路由的超鏈接,我們在Home下面的Index頁面上加入下面代碼
@Html.RouteLink("Test",new{controller="Section",action="Index",id=123})
@Html.RouteLink("Default",new{controller="Home",action="Index",id=123})
這裡注意:上面兩個方法並不能確定使用哪個路由來生成URL,他們只提供了一些路由值,正如所期望的,第一個方法生成指向/code/p/Index/123的URL,第二個方法生成指向/Home/Index/123的URL.
對於上面的這些簡單實例而言,生成URL非常簡單,但是有些情形還是會令我們頭疼。
假設我們在路由列表的開始部分加入如下的頁面路由,為了使/aspx/Page.aspx/頁面處理/static/url
routes.MapPageRoute( "new", "static/url", "~/aspx/SomePage.aspx" );
注意我們在實驗中不能將這個路由放在路由列表的末尾,否則他不能匹配傳入的請求,我們就看不到我們想要的效果。為什麼會這樣呢?因為默認路由會在他之前與我們前面的那兩個路由匹配,因此我們要把該路由放到路由列表的開始部分。
那麼將上面的路由放到路由列表的開始位置會有說明變化呢?對於傳入的請求而言,該路由只能匹配URL為/static/url的請求,而不匹配任何其它的請求,這也正是我們想要的。我們看一下我們點擊上面兩個超鏈接返回的URL都是不可用的:
/static/url?controller=Section&action=Index&id=123
/static/url?controller=Home&action=Index&id=123
通常情況下,當使用路由機制生成URL時,我們提供的路由值被用來填充URL參數,但是我們可以看到上面這個路由根本沒有URL參數("/static/url"),因此他可以匹配每一個可能生成的URL,也就是我們上面兩個鏈接都匹配了這個路由,所以生成了沒有用的URL。
這時我們可以指定路由名稱,不僅可以避免二義性,甚至在某種程度上提高性能,因為路由引擎可以直接定位到指定的路由,並嘗試用它來生成URL。
在前面的實例中,我們生成了兩個鏈接,下面我們做些修改,就可以看到命名路由的優點了(下面的代碼使用了命名參數):
@Html.RouteLink( linkText:"route:test", routeName:"test", routeValues:new{controller="section",action="index",id=123}) @Html.RouteLink( linkText:"Default", routeName:"Default", routeValues:new {controller="Home",action="index",id=123})
這樣我們就可以正確找到路由了."人們的名字是他們命運的縮寫"。這句話同樣使用與生成URL的路由。