程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET MVC的路由機制:命名路由

ASP.NET MVC的路由機制:命名路由

編輯:關於ASP.NET

首先看一下命名路由和沒有命名的差別:

命名路由:

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的路由。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved