返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)
原文:返璞归真 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
[源码下载]
返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)的更多相关文章
- ASP.net 的URL路由选择(System.Web.Routing.dll)
System.Web.Routing是.net 3.5sp1中新增的一个dll,用它提拱的类可以很方便的实现url的映射,在asp.net WebFrom的编程中可以使客户端请求的URL变得更加的&q ...
- 【ASP.NET MVC】"[A]System.Web.WebPages.Razor.Configuration.HostSection 无法强制转换为 ..."的解决办法
1.错误页面: “/”应用程序中的服务器错误. [A]System.Web.WebPages.Razor.Configuration.HostSection 无法强制转换为 [B]System.Web ...
- 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作
原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...
- 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API
原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API [索引页][源码下载] 返璞归真 asp.net mvc (10) - asp.net ...
- 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性
[索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...
- 返璞归真 asp.net mvc (4) - View/ViewEngine
原文:返璞归真 asp.net mvc (4) - View/ViewEngine [索引页] [源码下载] 返璞归真 asp.net mvc (4) - View/ViewEngine 作者:web ...
- 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test
原文:返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test [索引页] [源码下载] 返璞归真 ...
- 返璞归真 asp.net mvc (3) - Controller/Action
原文:返璞归真 asp.net mvc (3) - Controller/Action [索引页] [源码下载] 返璞归真 asp.net mvc (3) - Controller/Action 作者 ...
- 返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性
原文:返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性 [索引页][源码下载] 返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性 ...
随机推荐
- Android中<meta-data>的使用
在AndroidManifest.xml中.<meta-data>元素能够作为子元素,被包括在<activity>.<application> .<servi ...
- WPF-19:分享一个样式(左右滑动选中的checbox)
首先看下效果. 选中: 不选中 样式: <Style x:Key="CheckStyle" TargetType="{x:Type CheckBox}"& ...
- Linux 内核升级步骤
1.解压内核文件包#xz -d linux-3.2.63.tar.xz #tar xvf linux-3.2.63.tar 2.拷贝解压文件到/usr/src#cp -r linux-3.2.63 / ...
- poj2411(状压dp)
题目链接:http://poj.org/problem?id=2411 题意:由1*2 的矩形通过组合拼成大矩形,求拼成指定的大矩形有几种拼法. 分析:如果是横着的就定义11,如果竖着的定义为竖着的0 ...
- hdu1992(递推)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1992 题意:用1*2和2*1的小长方形铺垫4*W的方格有多少种方法. 分析:假如新加入1列,这列都竖着 ...
- NYOJ115 市叛乱 【SPFA】
城市平乱 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市 ...
- SVN的revert和update命令的区别
svn中的revert和update 今天有人问到revert和update的问题. 刚开始还真被问住了. 因为感觉revert和update都可以将本地的copy更新到以前的一个版本,会有什么不同呢 ...
- 设计模式六大原则(4):接口隔离原则(Interface Segregation Principle)
接口隔离原则: 使用多个专门的接口比使用单一的总接口要好. 一个类对另外一个类的依赖性应当是建立在最小的接口上的. 一个接口代表一个角色,不应当将不同的角色都交给一个接口.没有关系的接口合并在一起,形 ...
- 【cocos2d-x制作别踩白块儿】第一期:游戏介绍
这一系类文章.我们将来分析时下最火的一款游戏 -- 别踩白块儿. 无图无真相,先上图 这就是我们终于要完毕项目的效果图. 游戏刚開始的最以下有一栏为黄色,紧接着上面每一行都是有一个黑色块,其余为白色块 ...
- Android版本铎A梦幻连连看游戏源代码完整版
我写主代码,没有版权问题,它少量小游戏和应用源代码稍后会陆续上线!哆啦A梦连连看包含了2种游戏模式和60关卡,并能够通过改动配置文件非常方便的实现自行添加新关卡.採用andengine游戏引擎开发,内 ...