天天看點

返璞歸真 asp.net mvc (2) - 路由(System.Web.Routing)

<a href="http://webabcd.blog.51cto.com/1787395/341060" target="_blank">[索引頁]</a>

<a href="http://down.51cto.com/data/99931" target="_blank">[源碼下載下傳]</a>

返璞歸真 asp.net mvc (2) - 路由(System.Web.Routing)

介紹

System.Web.Routing - 此命名空間提供用于 URL 路由的類,通過該類可以使用不映射到實體檔案的 URL

IRouteHandler - 路由處理程式接口,自定義的路由處理程式都要實作這個接口

RequestContext - 封裝所請求的路由的相關資訊和目前的 http 上下文資訊

RouteData - 所請求的路由的相關資訊

RouteCollection - 路由集合

RouteValueDictionary - 不區分大小寫的 key/value 字典表

Route - 路由的相關資訊

示例

1、MyHandler.cs

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Web; 

using System.Web.Routing; 

namespace MVC.RoutingDemo 

        /**//// &lt;summary&gt; 

        /// 路由處理程式 

        /// &lt;/summary&gt; 

        public class MyRouteHandler : IRouteHandler 

        { 

                /**//* 

                 * IRouteHandler - 路由處理程式接口,自定義的路由處理程式都要實作這個接口    

                 *         該接口有一個方法 IHttpHandler GetHttpHandler(RequestContext requestContext) 

                 *         此方法需要傳回一個處理該路由的 http 處理程式 (HttpHandler) 

                 * RequestContext - 封裝所請求的路由的相關資訊和目前的 http 上下文資訊 

                 *         RequestContext.HttpContext - 目前的 http 上下文資訊 

                 *         RequestContext.RouteData - 所請求的路由的相關資訊 

                 */ 

IHttpHandler GetHttpHandler() IHttpHandler GetHttpHandler(RequestContext requestContext) 

                { 

                        return new MyHttpHandler(requestContext); 

                } 

        } 

        /// 自定義的 http 處理程式,由路由決定使用哪個 http 處理程式 

        public class MyHttpHandler : IHttpHandler 

                public RequestContext RequestContext { get; private set; } 

MyHttpHandler() MyHttpHandler(RequestContext context) 

                        RequestContext = context; 

void ProcessRequest() void ProcessRequest(HttpContext httpContext) 

                        /**//* 

                         * RouteData - 所請求的路由的相關資訊 

                         *         RouteData.Values - 一個字典表(key - 路由參數;value - 路由值) 

                         *         RouteData.DataTokens - 自定義需要傳遞的資料,也是一個字典表 

                         *         RouteData.GetRequiredString(string key) - 擷取指定的路由參數所對應的路由值 

                         */ 

                        httpContext.Response.Write("相關參數為:&lt;br /&gt;"); 

                        foreach (var dic in RequestContext.RouteData.Values) 

                        { 

                                httpContext.Response.Write(dic.Key + " : " + dic.Value + "&lt;br /&gt;"); 

                        } 

                        httpContext.Response.Write("相關Token為:&lt;br /&gt;"); 

                        foreach (var dic in RequestContext.RouteData.DataTokens) 

                public bool IsReusable 

                        get { return false; } 

        /// 如果有 n 多的路由處理程式,為了友善調用,減少代碼,我們可以将其寫成一個 Factory 類,如下: 

        public class RouteHandlerFactory : IRouteHandler 

                private string _name; 

RouteHandlerFactory() RouteHandlerFactory(string name) 

                        _name = name; 

                        if (_name == "My") 

                                return new MyHttpHandler(requestContext); 

        /// 示範不經過路由,根據 web.config 中的 HttpHandler 相關配置,由此 HttpHandler 直接處理相關請球。具體配置見 Global.asax 

        public class XXXHttpHandler : IHttpHandler 

XXXHttpHandler() XXXHttpHandler() 

void ProcessRequest() void ProcessRequest(HttpContext context) 

                        context.Response.Write(context.Request.Url.ToString()); 

}

2、Web.config

&lt;?xml version="1.0"?&gt; 

&lt;configuration&gt; 

    &lt;system.web&gt; 

        &lt;httpHandlers&gt; 

            &lt;!-- 

            配置一個自定義的 HttpHandler,用于處理字尾名為 xxx 的頁面 

            如果不需要将 *.xxx 交給路由處理,而是直接讓指定的 HttpHandler 處理,請參看 Global.asax 中的配置 

            --&gt; 

            &lt;add verb="*" path="*.xxx" type="MVC.RoutingDemo.XXXHttpHandler" /&gt; 

        &lt;/httpHandlers&gt; 

        &lt;httpModules&gt; 

            UrlRoutingModule - 用于比對 asp.net 應用程式中的路由的 http 請求 

                    該子產品找到比對路由後,會檢索 IRouteHandler 對象,以查找該路由,然後從該路由處理程式擷取一個 IHttpHandler 對象,并将該對象用作目前請求的 http 處理程式 

            &lt;add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt; 

        &lt;/httpModules&gt; 

    &lt;/system.web&gt; 

&lt;/configuration&gt;

3、Global.asax.cs

using System.Web.Mvc; 

namespace MVC 

        // Note: For instructions on enabling IIS6 or IIS7 classic mode,    

        // visit http://go.microsoft.com/?LinkId=9394801 

        public class MvcApplication : System.Web.HttpApplication 

static void RegisterRoutes() static void RegisterRoutes(RouteCollection routes) 

                        /**//* 路由方向:自上而下,查找到比對的就去處理,而不會繼續往下做比對 */ 

                         * RouteCollection - 路由集合 

                         *         RouteCollection.IgnoreRoute() - 指定的位址不由路由處理 

                         *         RouteCollection.Add() - 新增一個路由配置 

                         *         RouteCollection.MapRoute() - 映射一個路由(Add() 方法的簡化版,内部會自動調用 MvcRouteHandler) 

                        // .asd 檔案不走此路由 

                        routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

                        // .xxx 檔案不走此路由 

                        routes.Add(new Route("{resource}.xxx/{*pathInfo}", new StopRoutingHandler())); 

                         * RouteValueDictionary - 不區分大小寫的 key/value 字典表 

                         * Route - 路由的相關資訊 

                         *         Route.Url - 路由的 url 比對模式,{ } 内的為需要比對的路由參數名 

                         *         Route.Defaults - 路由參數的預設值 

                         *         Route.RouteHandler - 路由對應的路由處理程式 

                         *         Route.DataTokens - 自定義需要傳遞的資料 

                         *         Route.Constraints - 限制參數值的有效性(可以是正規表達式(不區分大小寫),也可以是實作了 IRouteConstraint 的對象) 

                        Route route = new Route( 

                                "Routing/{parent}/{child}", 

                                // RouteValueDictionary - 可以接收一個匿名對象為參數,屬性名轉換為 key, 屬性值轉換為 value 

                                new RouteValueDictionary(new { parent = "ria", child = "silverlight", controller = "Product", action = "Index" }), 

                                new RoutingDemo.MyRouteHandler() 

                        ); 

                        route.DataTokens = new RouteValueDictionary(new { token1 = "abc", token2 = "xyz" }); 

                        // HttpMethodConstraint - 實作了 IRouteConstraint 接口的類,用于限制 http 方法 

                        route.Constraints = new RouteValueDictionary(new { parent = @"^[a-zA-Z]+$", httpMethod = new HttpMethodConstraint("GET") }); 

                        // 将路由添加進路由集合,名稱可以随便設定,但必須唯一(也可以不設定路由名稱) 

                        routes.Add("MyRoutingDemo", route); 

                        // routes.Add(route); 

                        // * - 路由也支援通配符 

                        // {*param} - 代表比對任意值,其中路由參數名為 param 

                        routes.Add(new Route("Wildcard/{*param}", new RouteValueDictionary(new { controller = "Product", action = "Index" }), new RoutingDemo.MyRouteHandler())); 

                        // MapRoute() 封裝了 Add(), MapRoute() 内部會自動調用 MvcRouteHandler 

                        // 其中必須要有 controller 項和 action 項 

                        // 其中設定 namespaces 參數相當于 route.DataTokens["Namespaces"] = namespaces; 

                        routes.MapRoute( 

                                "Products", 

                                "ProductList/{pageIndex}", 

                                new { controller = "Product", action = "Index", pageIndex = 0 } 

                                "Default",                                                                                            // Route name 

                                "{controller}/{action}/{id}",                                                     // URL with parameters 

                                new { controller = "Home", action = "Index", id = "" }    // Parameter defaults 

void Application_Start() void Application_Start() 

                        RegisterRoutes(RouteTable.Routes); 

                        // 調試路由(需要 RouteDebug.dll),調用如下語句後,會在每個頁面都顯示詳細的路由資訊 

                        // RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes); 

// 部署在 iis 應注意 

// 配置通配符映射程式,類似如下位址 

// C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll        

// 不要勾選“确認檔案是否存在”

OK

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/341116,如需轉載請自行聯系原作者

繼續閱讀