如何使用URL Routing 进行URL重写
什么是URL Routing?
所谓URL Routing(URL路由),指的是在Web中,URL指向的不再是某个物理文件,而是一个说明有关URL路由的字符串,开发者可以自定义该字符串的格式。在默认情况下,URL Routing在ASP.NET应用程序中是可以直接使用的,但在ASP.NET站点上,需要做一些配置才能使用。
为什么要使用URL Routing?
在使用URL Routing前,我们的URL可能是http://www.mysite.com/profile.aspx?userid=1,使用URL Routing后,我们的URL可以变成http://www.mysite.com/profile/1。修改后的URL更加友好,更有利于SEO。至于其它目的嘛,在使用过程中再慢慢挖掘吧。
URL Routing只能在MVC中才能使用吗?
路由程序集(System.Web.Routing.dll)在.NET Framework V3.5 sp1中就包含了,而MVC是在之后才发布的。因此不能说URL Routing只能在MVC中才能使用。不过在MVC中增加了Routing在一些扩展方法(包含在System.Web.Mvc的RouteCollectionExtemsion类中),使用起来更加方便。
下面简单介绍下如何在Web Form中使用URL Routing。
1. 添加对程序集System.Web.Abstractions.dll,System.Web.Routing.dll的引用
2. 添加一个IRouteHandler的实现类CustomRouteHanlder
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
2 using System.Web.Compilation;
3 using System.Web.Routing;
4 using System.Web.UI;
5
6 public class CustomRouteHandler : IRouteHandler
7 {
8 public string VirtualPath
9 {
10 get;
11 private set;
12 }
13
14 public CustomRouteHandler(string virtualPath)
15 {
16 this.VirtualPath = virtualPath;
17 }
18
19 #region IRouteHandler Members
20
21 public IHttpHandler GetHttpHandler(RequestContext requestContext)
22 {
23 var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;
24 return page;
25 }
26
27 #endregion
28 }
3. 配置web.config文件
2 <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
3 </httpModules>
4. 在Global.asax页面中注册路由表
4.1 添加名称空间引用
4.2 在Application_Start事件中注册路由表
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
2 {
3 RegisterRoutes(RouteTable.Routes);
4 }
5
6 void RegisterRoutes(RouteCollection routes)
7 {
8 routes.Add("Demo1", new Route("Demo1/", new CustomRouteHandler("~/WebForm1.aspx")));
9 }
4.3 如何设定URL Routing参数
2 {
3 routes.Add("Demo2", new Route("Demo2/{action}", new CustomRouteHandler("~/WebForm2.aspx")));
4 }
4.4 如何设定URL Routing参数的黙认值
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
2 {
3 routes.Add("Demo3", new Route("Demo3/{action}", new RouteValueDictionary { { "action", "show" } }, new CustomRouteHandler("~/WebForm3.aspx")));
4 }
4.5 如何在路由目标页面使用URL里的参数
4.5.1 修改自定义类CustomRouteHanlder
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
{
// 从ReqestContext对象中获取URL参数,并把值写到HttpContext的Items集合中供路由目标页面使用
foreach (var urlParm in requestContext.RouteData.Values)
{
requestContext.HttpContext.Items[urlParm.Key] = urlParm.Value;
}
var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;
return page;
}
4.5.2 在路由目标页面中读取URL参数
4.6 如何为URL参数添加约束(使用正则表达式验证)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
2 {
3 routes.Add("Demo4", new Route("Demo4/{action}", new RouteValueDictionary { { "action", "show" } }, new RouteValueDictionary { { "action", @"\w{4}" } }, new CustomRouteHandler("~/WebForm4.aspx")));
4 }
如代码所示,要求action参数值必须是4个任意字符,若action参数长度不等于4个字符,则会得到“无法找到资源”的错误提示。如:”\d{4}“只能是4位数字