System.Web.Routing入門及進(jìn)階
System.Web.Routing用于在Asp.net的Web應(yīng)用程序中進(jìn)行URLRouting。
所謂UrlRouting就是將一個地址映射為另一個地址,比如我訪問/chsword/2008/08/27.html其實(shí)是訪問了/chsword/article.aspx?y=2008&m=08&d=27這個地址,URLRouting使我們的URL看起來非常漂亮。
本文將分2部分介紹UrlRouting的使用分別為入門篇與進(jìn)階篇。
文章的前提:
1.安裝Visual Studio 2008 sp1或其它IDE的等同版本。
2.建立一個Asp.net Web Application(Asp.net Web應(yīng)用程序)
3.引用System.Web.Routing程序集。
UrlRouting的實(shí)現(xiàn)原理
如果你不是追求理論的人,僅僅是務(wù)實(shí)主義,可以直接從準(zhǔn)備工作讀起。
為了方便大家理解我繪制了一個UML圖,其中通過RouteTable的Routes這個屬性可以獲取一個RouteCollection的Singleton模式,雖然在其中并沒有判斷值不存在時才初始化的Singleton的標(biāo)志性行為,但是它是在Application_Start事件中進(jìn)行初始化的,并且直到應(yīng)用程序進(jìn)程終結(jié),所以是Singleton模式的。 
而通過以下方式將Route添加到RouteTable.Routes中
RouteTable.Routes.Add(new Route());
以上代碼僅為表示其流程,這個代碼是不能正確執(zhí)行的,因?yàn)镽oute沒有提供無參構(gòu)造函數(shù)。
Route初始化時則是利用RouteValueDictionary來加入默認(rèn)值及規(guī)則到Route中
另外Route還有一個IRouteHandler的實(shí)現(xiàn)對象,IRouteHandler的實(shí)現(xiàn)對象提供了一個GetHttpHandler方法來獲取用于處理URL的IHttpHandler。
這么說還是停留在抽象層次的,下面我們以一些簡單例子來帶你馭起UrlRouting。
準(zhǔn)備工作
由于須要一個處理Url的IHttpHandler所以我們先定義一個實(shí)現(xiàn)了IHttpHandler接口的類。
就叫它MyPage,由于我們要與IRouteHandler交互,所以除了實(shí)現(xiàn)IHttpHandler的方法之外還要聲明一個RequestContext類型的屬性。
public class MyPage:IHttpHandler {
public RequestContext RequestContext { get; private set; }
public MyPage(RequestContext context)
{
this.RequestContext = context;
}
#region IHttpHandler 成員
public virtual void ProcessRequest(HttpContext context){}
public bool IsReusable {
get { return false; }
}
#endregion
}
這樣我們就擁有了一個自己的IHttpHandler。
下面我們實(shí)現(xiàn)一個IRouteHandler:
public class MyRouteHandler : IRouteHandler {
#region IRouteHandler 成員
public IHttpHandler GetHttpHandler(RequestContext requestContext) {
return new MyPage(requestContext);
}
#endregion
}
這里實(shí)現(xiàn)了IRouteHandler的GetHttpHandler方法,使之返回剛才我們實(shí)現(xiàn)的MyPage。
這樣我們前期的2個工作就做完了,我們可以來實(shí)現(xiàn)UrlRouting了。
實(shí)現(xiàn)第一個UrlRouting
其實(shí)UrlRouting在定義完上兩個規(guī)則后就很簡單了。
在Golbal.asax(沒有可以新建一個)的Application_Start事件中寫如下代碼
protected void Application_Start(object sender, EventArgs e) {
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes) {
routes.Add(new Route("{page}.aspx",new MyRouteHandler()));
}
這樣我們就定義了第一個UrlRouting規(guī)則就是對xxxx.aspx這類的Url進(jìn)行Routing。
但是我們僅僅是定義了處理了什么樣的Url,卻沒定義如何處理。
我們應(yīng)該在剛剛定義的MyPage的ProcessRequest方法中定義如何處理。
我們將ProcessRequest方法實(shí)現(xiàn)如下:
public virtual void ProcessRequest(HttpContext context){
context.Server.Execute( RequestContext.RouteData.Values["page"].ToString().Replace("_","/")+".aspx"
);
}
很顯然這里的RequestContext.RouteData.Values["page"]就是取到剛才的規(guī)則{page}.aspx中的page的值即,如果我訪問index.aspx則RequestContext.RouteData.Values["page"]就是index。
我這里的定義是將”_”替換為”/”所以就是將list_index.aspx這樣的URL轉(zhuǎn)到list/index.aspx這樣的網(wǎng)頁上。
我們建立一些測試用的網(wǎng)頁如下圖所示:

在這些網(wǎng)頁里隨意寫些可以分辨網(wǎng)頁的文字。
則訪問list_chsword.aspx時自動Routing到了list/chsword.aspx上了。
總結(jié)一下UrlRouting與以下有關(guān):
1. Application_Start中定義的規(guī)則
2. 自己實(shí)現(xiàn)的IHttpHandler類
這樣您對于UrlRouting就算是入門了,下一篇我們將來講一些進(jìn)階設(shè)置。
相關(guān)文章
Asp.net利用JQuery彈出層加載數(shù)據(jù)代碼
最近看QQ空間里面的投票功能很使用。點(diǎn)擊一個鏈接就彈出一個層,然后再加載一些投票信息,旁邊的區(qū)域變成灰色不可用狀態(tài)。其實(shí)這不算什么高深的技術(shù),只要在ASP.NET中利用JQuery結(jié)合一般處理程序ASHX即可搞定了。2009-11-11
ASP.NET中實(shí)現(xiàn)獲取調(diào)用方法名
這篇文章主要介紹了ASP.NET中實(shí)現(xiàn)獲取調(diào)用方法名的技巧,較為詳細(xì)的講述了相關(guān)的命名空間的調(diào)用及語句執(zhí)行順序,具有一定的參考借鑒價值,需要的朋友可以參考下2014-12-12
win2003服務(wù)器asp.net權(quán)限設(shè)置問題及解決方法
ASP.NET相對于ASP,設(shè)置權(quán)限方面有點(diǎn)不同,有一點(diǎn)兒設(shè)置錯了都運(yùn)行不到。在網(wǎng)上搜索到的都是很垃圾的答案,沒有一個用得到的,下面是我自己設(shè)置并從中遇到的問題摸索后得到的經(jīng)驗(yàn),給大家分享。2011-08-08
ASP.NET獲取MS SQL Server安裝實(shí)例實(shí)現(xiàn)思路及代碼
在演示中,是把找到的實(shí)例顯示于DropDownList控件中。首先在.aspx拉一個DropDownList控件,感興趣的朋友可以了解下哦,或許對你有所幫助2013-01-01
詳解在Azure上部署Asp.NET Core Web App
這篇文章主要介紹了詳解在Azure上部署Asp.NET Core Web App,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
ASP .NET調(diào)用javascript中Response.Write和ClientScript.RegisterSta
最近在用ASP .NET的code behind 調(diào)用javascript中發(fā)現(xiàn)Response.Write不能拿到form的值,而ClientScript.RegisterStartupScript可以。2010-12-12

