ASP.NET MVC路由擴充:路由映射

來源:互聯網
上載者:User

上周我寫了三篇文章(一、二、三)詳細地介紹了ASP.NET的路由系統。ASP.NET的路由系統旨在通過註冊URL模板與物理檔案之間的映射進而實現請求地址與檔案路徑之間的分離,但是對於ASP.NET MVC應用來說,請求的目標不再是一個具體的物理檔案,而是定義在某個Controller類型中的Action方法。出於自身路由特點的需要,ASP.NET對ASP.NET的路由系統進行了相應的擴充。

一、基本路由映射

通過前面的介紹我們知道基於某個物理檔案的路由映射通過調用代表全域路由表的RouteTable的靜態屬性Routes(一個RouteCollection對象)的MapPageRoute方法來完成,為了實現針對目標Controller和Action的路由,ASP.NET MVC針對RouteCollection類型定義了一系列的擴充方法以實現檔案路徑無關的路由映射,這些擴充方法定義在RouteCollectionExtensions類型中。如下面的代碼片斷所示,RouteCollectionExtensions定義了兩組方法,方法IgnoreRoute用於註冊不需要進行路由的URL模板,對應於RouteCollectionExtensions的Ignore方法;彷彿MapRoute用於進行基於URL模板的路由註冊,對應於RouteCollectionExtensions的MapPageRoute方法。

   1: public static class RouteCollectionExtensions
2: {
3: //其他成員
4: public static void IgnoreRoute(this RouteCollection routes, string url);
5: public static void IgnoreRoute(this RouteCollection routes, string url, object constraints);
6:
7: public static Route MapRoute(this RouteCollection routes, string name, string url);
8: public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);
9: public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);
10: public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);
11: public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);
12: public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
13: }

由於ASP.NET MVC的路由註冊與具體的物理檔案無關,所以MapRoute方法中並沒有一個表示檔案路徑的physicalFile參數。與直接定義在RouteCollectionExtensions中的Ignore和MapPageRoute方法不同的是,表示預設變數的參數defaults和基於Regex的變數約束的參數constraints都不再是一個RouteValueDictionary對象,而是一個普通的object。這主要是為了編程上的便利,使得我們可以通過匿名型別的方式來指定這兩個參數值。該方法在內部會通過反射的方式得到指定對象所有屬性值,並轉換為RouteValueDictionary對象,其屬性名稱和屬性值作為字典元素的Key和Value。

對於ASP.NET MVC來說,最終需要通過在請求地址中指定的Controller名稱來建立具體的Controller執行個體。由於Controller名稱 僅僅對應著類型的名稱,Controller的成功執行個體化的前提是我們能夠正確地解析出它的具體類型,所以我們需要使用了命名空間。在調用MapRoute方法的時候我們可以通過字串數群組類型的參數namespaces來指定一個命名空間的列表。對於註冊的命名空間,可以指定一個代表完整命名空間的字串,也可以使用“*”作為萬用字元。

添加的命名控制項列表最終是被儲存於Route對象的DataTokens屬性中,對應的Key為“Namespaces”。MapRoute方法沒有為初始化Route對象的DataTokens屬性提供相應的參數,如果沒有指定命名空間列表,所有通過該方法添加的Route對象的DataTokens屬性總是一個空的RouteValueDictionary對象。

對於針對定義在某個Controller中的某個Action的請求,如果註冊的路由表與之匹配,具體匹配的某個路由對象的GetRouteData被調用並返回一個具體的RouteData對象。根據對請求地址進行解析得到的目標Controller和Action的名稱必須包含在該RouteData的Values屬性對應的RouteValueDictionary對象中,其對應的Key分別為controller和action。

二、 執行個體示範:註冊路由映射與查看路由資訊

ASP.NET MVC通過定義在RouteCollectionExtensions中的擴充方法MapRoute進行路由映射,為了讓讀者對此有一個深刻的認識,我們來進行一個簡單的執行個體示範。我們依然沿用之前關於擷取天氣資訊的情境,看看通過這種方式進行註冊的Route對象針對匹配的HTTP請求返回怎樣的RouteData對象。[原始碼從這裡下載]

我們在建立的ASP.NET Web應用(不是ASP.NET MVC應用)添加一個Web頁面(Default.aspx),並按照之前的方式以內聯代碼的方式直接將RouteData的相關屬性顯示出來,頁面主體部分的HTML如下所示。需要注意的是我們顯示的RouteData是從定義的方法GetRouteData方法擷取的,而不是對應於當前頁面的RouteData屬性。

   1: <body>
2: <form id="form1" runat="server">
3: <div>
4: <table>
5: <tr>
6: <td>Route:</td>
7: <td><%=GetRouteData().Route != null? GetRouteData().Route.GetType().FullName:"" %></td>
8: </tr>
9: <tr>
10: <td>RouteHandler:</td>
11: <td><%=GetRouteData().RouteHandler != null? GetRouteData().RouteHandler.GetType().FullName:"" %></td>
12: </tr>
13: <tr>
14: <td>Values:</td>
15: <td>
16: <ul>
17: <%foreach (var variable in GetRouteData().Values)
18: {%>
19: <li><%=variable.Key%>=<%=variable.Value%></li>
20: <% }%>
21: </ul>
22: </td>
23: </tr>
24: <tr>
25: <td>DataTokens:</td>
26: <td>
27: <ul>
28: <%foreach (var variable in GetRouteData().DataTokens)
29: {%>
30: <li><%=variable.Key%>=<%=variable.Value%></li>
31: <% }%>
32: </ul>
33: </td>
34: </tr>
35: </table>
36: </div>
37: </form>
38: </body>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.