返璞歸真 asp.net mvc (2) - 路由(System.Web.Routing)
[索引頁]
[源碼下載]
作者:webabcd
介紹
System.Web.Routing - 此命名空間提供用于 URL 路由的類,通過該類可以使用不映射到物理文件的 URL
示例
1、MyHandler.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Web.Routing;

namespace MVC.RoutingDemo
{
/// <summary>
/// 路由處理程序
/// </summary>
public class MyRouteHandler : IRouteHandler
{
/*
* IRouteHandler - 路由處理程序接口,自定義的路由處理程序都要實現這個接口
* 該接口有一個方法 IHttpHandler GetHttpHandler(RequestContext requestContext)
* 此方法需要返回一個處理該路由的 http 處理程序 (HttpHandler)
* RequestContext - 封裝所請求的路由的相關信息和當前的 http 上下文信息
* RequestContext.HttpContext - 當前的 http 上下文信息
* RequestContext.RouteData - 所請求的路由的相關信息
*/

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MyHttpHandler(requestContext);
}
}

/// <summary>
/// 自定義的 http 處理程序,由路由決定使用哪個 http 處理程序
/// </summary>
public class MyHttpHandler : IHttpHandler
{
public RequestContext RequestContext { get; private set; }
public MyHttpHandler(RequestContext context)
{
RequestContext = context;
}

public void ProcessRequest(HttpContext httpContext)
{
/*
* RouteData - 所請求的路由的相關信息
* RouteData.Values - 一個字典表(key - 路由參數;value - 路由值)
* RouteData.DataTokens - 自定義需要傳遞的數據,也是一個字典表
* RouteData.GetRequiredString(string key) - 獲取指定的路由參數所對應的路由值
*/

httpContext.Response.Write("相關參數為:<br />");
foreach (var dic in RequestContext.RouteData.Values)
{
httpContext.Response.Write(dic.Key + " : " + dic.Value + "<br />");
}

httpContext.Response.Write("相關Token為:<br />");
foreach (var dic in RequestContext.RouteData.DataTokens)
{
httpContext.Response.Write(dic.Key + " : " + dic.Value + "<br />");
}
}

public bool IsReusable
{
get { return false; }
}
}

/// <summary>
/// 如果有 n 多的路由處理程序,為了方便調用,減少代碼,我們可以將其寫成一個 Factory 類,如下:
/// </summary>
public class RouteHandlerFactory : IRouteHandler
{
private string _name;
public RouteHandlerFactory(string name)
{
_name = name;
}

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
if (_name == "My")
return new MyHttpHandler(requestContext);

return new MyHttpHandler(requestContext);
}
}

/// <summary>
/// 演示不經過路由,根據 web.config 中的 HttpHandler 相關配置,由此 HttpHandler 直接處理相關請球。具體配置見 Global.asax
/// </summary>
public class XXXHttpHandler : IHttpHandler
{
public XXXHttpHandler()
{

}

public void ProcessRequest(HttpContext context)
{
context.Response.Write(context.Request.Url.ToString());
}

public bool IsReusable
{
get { return false; }
}
}
}
2、Web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>

<!--
配置一個自定義的 HttpHandler,用于處理后綴名為 xxx 的頁面
如果不需要將 *.xxx 交給路由處理,而是直接讓指定的 HttpHandler 處理,請參看 Global.asax 中的配置
-->
<add verb="*" path="*.xxx" type="MVC.RoutingDemo.XXXHttpHandler" />

</httpHandlers>
<httpModules>
<!--
UrlRoutingModule - 用于匹配 asp.net 應用程序中的路由的 http 請求
該模塊找到匹配路由后,會檢索 IRouteHandler 對象,以查找該路由,然后從該路由處理程序獲取一個 IHttpHandler 對象,并將該對象用作當前請求的 http 處理程序
-->
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
</system.web>
</configuration>
3、Global.asax.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

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
{
public 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 }
);

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}

protected 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
[源碼下載]
[源碼下載]
返璞歸真 asp.net mvc (2) - 路由(System.Web.Routing)
作者:webabcd
介紹
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
{
/// <summary>
/// 路由處理程序
/// </summary>
public class MyRouteHandler : IRouteHandler
{
/*
* IRouteHandler - 路由處理程序接口,自定義的路由處理程序都要實現這個接口
* 該接口有一個方法 IHttpHandler GetHttpHandler(RequestContext requestContext)
* 此方法需要返回一個處理該路由的 http 處理程序 (HttpHandler)
* RequestContext - 封裝所請求的路由的相關信息和當前的 http 上下文信息
* RequestContext.HttpContext - 當前的 http 上下文信息
* RequestContext.RouteData - 所請求的路由的相關信息
*/
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MyHttpHandler(requestContext);
}
}
/// <summary>
/// 自定義的 http 處理程序,由路由決定使用哪個 http 處理程序
/// </summary>
public class MyHttpHandler : IHttpHandler
{
public RequestContext RequestContext { get; private set; }
public MyHttpHandler(RequestContext context)
{
RequestContext = context;
}
public void ProcessRequest(HttpContext httpContext)
{
/*
* RouteData - 所請求的路由的相關信息
* RouteData.Values - 一個字典表(key - 路由參數;value - 路由值)
* RouteData.DataTokens - 自定義需要傳遞的數據,也是一個字典表
* RouteData.GetRequiredString(string key) - 獲取指定的路由參數所對應的路由值
*/
httpContext.Response.Write("相關參數為:<br />");
foreach (var dic in RequestContext.RouteData.Values)
{
httpContext.Response.Write(dic.Key + " : " + dic.Value + "<br />");
}
httpContext.Response.Write("相關Token為:<br />");
foreach (var dic in RequestContext.RouteData.DataTokens)
{
httpContext.Response.Write(dic.Key + " : " + dic.Value + "<br />");
}
}
public bool IsReusable
{
get { return false; }
}
}
/// <summary>
/// 如果有 n 多的路由處理程序,為了方便調用,減少代碼,我們可以將其寫成一個 Factory 類,如下:
/// </summary>
public class RouteHandlerFactory : IRouteHandler
{
private string _name;
public RouteHandlerFactory(string name)
{
_name = name;
}
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
if (_name == "My")
return new MyHttpHandler(requestContext);
return new MyHttpHandler(requestContext);
}
}
/// <summary>
/// 演示不經過路由,根據 web.config 中的 HttpHandler 相關配置,由此 HttpHandler 直接處理相關請球。具體配置見 Global.asax
/// </summary>
public class XXXHttpHandler : IHttpHandler
{
public XXXHttpHandler()
{
}
public void ProcessRequest(HttpContext context)
{
context.Response.Write(context.Request.Url.ToString());
}
public bool IsReusable
{
get { return false; }
}
}
}2、Web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<!--
配置一個自定義的 HttpHandler,用于處理后綴名為 xxx 的頁面
如果不需要將 *.xxx 交給路由處理,而是直接讓指定的 HttpHandler 處理,請參看 Global.asax 中的配置
-->
<add verb="*" path="*.xxx" type="MVC.RoutingDemo.XXXHttpHandler" />
</httpHandlers>
<httpModules>
<!--
UrlRoutingModule - 用于匹配 asp.net 應用程序中的路由的 http 請求
該模塊找到匹配路由后,會檢索 IRouteHandler 對象,以查找該路由,然后從該路由處理程序獲取一個 IHttpHandler 對象,并將該對象用作當前請求的 http 處理程序
-->
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
</system.web>
</configuration>
3、Global.asax.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
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
{
public 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 }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected 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
[源碼下載]


浙公網安備 33010602011771號