如何在WebForm中使用Url Routing之说明
什么是URL Routing?
所谓URL Routing(URL路由),指的是在Web中,URL指向的不再是某个物理文件,而是一个说明有关URL路由的字符串,开发者可以自定义该字符串的格式。在默认情况下,URL Routing在ASP.NET应用程序中是可以直接使用的,但在ASP.NET站点上,需要做一些配置才能使用
为什么要使用URL Routing?
在使用URL Routing前,我们的URL可能是http://www.website.com/Index.aspx?id=1,使用URL Routing后,我们的URL可以变成http://www.website.com/Index/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的实现类WebFormRouteHandler
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using System.Web.Compilation;
using System.Web.UI;
/// <summary>
///WebFormRouteHandler 的摘要说明
/// </summary>
public class WebFormRouteHandler:IRouteHandler
{
/// <summary>
/// 具体呈现的页面路径
/// </summary>
public string VirtualPath
{
get;
private set;
}
public WebFormRouteHandler(string virtualpath)
{
this.VirtualPath = virtualpath;
}
#region IRouteHandler 成员
/// <summary>
/// 实现 IHttpHandler接口中的GetHttpHandler方法,
/// </summary>
/// <param name="requestContext"></param>
/// <returns></returns>
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
// 从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;
}
#endregion
}
3. 修改配置web.config文件(必要的支持url Routing方法)
<httpModules>
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
<%@ Application Language="C#" %>
<%@ Import Namespace="System.Web.Routing" %>
<javascript runat="server">
public static void RegisterRoutes(RouteCollection routes)
{
//注意此处调用的是WebFormRouteHandler类
routes.Add("Named", new Route("NameIndex/{action}", new RouteValueDictionary { { "action", "NameIndex" } }, new WebFormRouteHandler("~/Named/Index.aspx")));
routes.Add("Numbers", new Route("NumberIndex/{action}", new RouteValueDictionary { { "action", "NumberIndex" } }, new WebFormRouteHandler("~/Numbers/Index.aspx")));
//添加验证,要求action参数值必须是13个字符,若action参数长度不等于13个字符(酌情更改),则会得到“无法找到资源”的错误提示。
routes.Add("Validate",new Route("ValidateIndex/{action}",new RouteValueDictionary { { "action", "ValidateIndex" }},new RouteValueDictionary { { "action", @"\w{13}" } },new WebFormRouteHandler("~/Validate/Index.aspx")));
}
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(System.Web.Routing.RouteTable.Routes);
}
void Application_End(object sender, EventArgs e)
{
//在应用程序关闭时运行的代码
}
void Application_Error(object sender, EventArgs e)
{
//在出现未处理的错误时运行的代码
}
void Session_Start(object sender, EventArgs e)
{
//在新会话启动时运行的代码
}
void Session_End(object sender, EventArgs e)
{
//在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式
//设置为 StateServer 或 SQLServer,则不会引发该事件。
}
</script>
1、Named(文件夹)
下面包含一个文件:Index.aspx
2、Numbers(文件夹)
下面包含一个文件:Index.aspx
3、Validate(文件夹)
下面包含一个文件:Index.aspx
现在要将项目的根目录下的Default.aspx文件稍作修改
添加如下内容:
<div><a href="NameIndex">Go To Named/Index</a></div><br />
<div><a href="NumberIndex">Go To Numbers/Index</a></div><br />
<div><a href="ValidateIndex">Go To ValidateIndex!</a></div>
所有的代码都写完了,下面进行调试,如果没有问题,代表程序可以跑 :)
最后运行程序,点击Default.aspx页面中的三个链接,看看效果 :)
最后说明:程序中包含了参数的使用,参数的验证等,
如果此程序同学们有什么更好的建议,请说明,如果您认为哪里有问题,请不要出口伤人,出来混,总是要还的 :)
如果有需要,本人会上传源码,欢迎同学们踊跃参与讨论;
人生的无奈那么多谁可以数得清?请告诉我!别回头走自己的路,就算有些事让人无助,至少我有一路吃苦的幸福!多年以后当我抬头望天空,湛蓝的色彩中依然有我沉郁多年的思绪!回归那一季那个曾叫‘山子’的男孩纯洁的微笑,然后宿命收拢指间,我们无处可逃
作者:Love Coding
出处:http://www.cnblogs.com/youshan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。