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

在這些網(wǎng)頁(yè)里隨意寫些可以分辨網(wǎng)頁(yè)的文字。
則訪問(wèn)list_chsword.aspx時(shí)自動(dòng)Routing到了list/chsword.aspx上了。
總結(jié)一下UrlRouting與以下有關(guān):
1. Application_Start中定義的規(guī)則
2. 自己實(shí)現(xiàn)的IHttpHandler類
這樣您對(duì)于UrlRouting就算是入門了,下一篇我們將來(lái)講一些進(jìn)階設(shè)置。
- ASP.NET組件System.Web.Optimization原理及緩存問(wèn)題詳解
- 無(wú)法將類型為“System.Web.UI.WebControls.HiddenField”的對(duì)象強(qiáng)制轉(zhuǎn)換為類型的錯(cuò)誤的解決
- System.Web.Routing入門及進(jìn)階
- NET Runtime Optimization Service 1101 錯(cuò)誤的解決方法
- ASP.NET MVC命名空間時(shí)引起錯(cuò)誤的解決方法
- ASP.Net中命名空間Namespace淺析和使用例子
- System.Web中不存在類型或命名空間名稱“Optimization”(是否缺少程序集引用?)
相關(guān)文章
.net動(dòng)態(tài)顯示當(dāng)前時(shí)間(客戶端javascript)
剛才在首頁(yè)看到 asp.net實(shí)現(xiàn)動(dòng)態(tài)顯示當(dāng)前時(shí)間 這篇文章, 作者用Ajax實(shí)現(xiàn)類似時(shí)鐘的效果!2009-11-11深入Lumisoft.NET組件開(kāi)發(fā)碰到亂碼等問(wèn)題的解決方法
本篇文章介紹了,在Lumisoft.NET組件開(kāi)發(fā)中碰到亂碼等一些問(wèn)題的解決方法。需要的朋友參考下2013-05-05Asp.Net 5分鐘實(shí)現(xiàn)網(wǎng)頁(yè)實(shí)時(shí)監(jiān)控
在項(xiàng)目開(kāi)發(fā)中經(jīng)常會(huì)用到監(jiān)控功能,下面通過(guò)本篇文章給大家介紹Asp.Net 5分鐘實(shí)現(xiàn)網(wǎng)頁(yè)實(shí)時(shí)監(jiān)控,需要的朋友可以參考下2017-12-12Asp.Net實(shí)現(xiàn)的通用分頁(yè)函數(shù)
這篇文章主要介紹了Asp.Net實(shí)現(xiàn)的通用分頁(yè)函數(shù),結(jié)合實(shí)例形勢(shì)分析了asp.net分頁(yè)函數(shù)的功能,定義及使用技巧,需要的朋友可以參考下2016-04-04ASP.NET下使用xml反序列化、緩存依賴實(shí)現(xiàn)個(gè)性化配置文件的實(shí)時(shí)生效
本文主要介紹了ASP.NET下使用xml反序列化、緩存依賴實(shí)現(xiàn)個(gè)性化配置文件的實(shí)時(shí)生效的方法。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01.NET中RDLC循環(huán)處理數(shù)據(jù)的應(yīng)用分析
本篇文章介紹了,.NET中RDLC循環(huán)處理數(shù)據(jù)的應(yīng)用分析。需要的朋友參考下2013-05-05asp.net coolite 刪除時(shí)彈出確定按鈕
如果用coolite的 Confirm() 是不知道你選擇了什么的 如上代碼才可以的2009-09-09