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

來源:互聯網
上載者:User

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

命名路由:

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的路由時會可能產生二義性。但給路由命名卻可以解決這個問題。

查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/aspx/

下面我們註冊兩個路由:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.