原文出處:
一、routebase
前面我們知道,urlroutingmodule通過遍歷routetable.routes中的路由物件來獲取匹配的routedata,從而將請求**到相應的ihttphandler處理程式。routetable.routes是乙個routebase物件集合,可向集合中新增任何routebase的子類。所以,我們可以通過建立乙個routebase的子類,然後將其新增到routetable.routes集合中,以此實現自定義路由規則。
routebase是乙個抽象類,包含兩個抽象方法:getroutedata用於檢查請求上下文是否符合路由規則,如果符合返回乙個routedata物件,若不符合則返回null,urlroutingmodule在在遍歷routes集合時,將呼叫此方法,如果方法返回非空,則終止遍歷,並將返回的routedata儲存到請求上下文(requestcontext)中。getvirtualpath方法用於檢查指定的路由資訊是否符合本路由規則,如果符合返回乙個virtualpathdata物件,通過該物件可以獲取響應的url,如果不符合則返回null,通常我們通過mvc中的html.routelink方法來生成url時,此方法會遍歷rouetable.routes中的路由物件,依次呼叫getvirtualpath方法,直到方法返回非空。
下面我們將建立乙個myroute類,該類將阻止ie瀏覽器方法**。
1、首先,我們建立乙個mvc2空應用程式專案,然後建立乙個名為home的控制器,在控制器中建立兩個action:index表示**首頁,limit表示乙個顯示限制資訊的頁面,如果瀏覽器為ie則會直接顯示此頁面類容。
2、建立index和limit活動所對應的檢視。
顯示行號 複製** ? index.aspx
顯示行號 複製** ? limit.aspx
不允許ie瀏覽器訪問
<%= html.routelink("route", new )%>
3、建立乙個myroute類,讓其繼承自routebase,重寫getroutedata和getvirtualpath方法:
顯示行號 複製** ? myroute.cs
public class myroute : routebase
return null;
}public override virtualpathdata getvirtualpath(requestcontext requestcontext, routevaluedictionary values)
return null;}}
4、開啟global.asax.cs檔案,找到registerroutes方法,將我們的myroute註冊到routetable.routes集合中,注意添route的順序很重要,urlroutingmodule在遍歷時是按照新增順序進行的,所以未保證myroute規則有效,必須將其放到第乙個位置。注意maproute方法是mvc框架對routecollection的擴充套件,用於新增乙個route物件到集合中,本質上內部也是呼叫的add方法。
public static void registerroutes(routecollection routes)
.axd/");
routes.add("myroute",new myroute());
routes.maproute(
"default", // route name
"//", // url with parameters
new // parameter defaults);}
啟動除錯,如果是ie瀏覽器,則會顯示「不允許ie瀏覽器訪問」,另外,請注意看myroute與route連線的位址,顯然myroute的位址是通過myroute類產生的,而route位址是通過route預設路由物件產生的。
二、iroutehandler
urlroutingmodule在獲取到合適的routedata後,將通過其routehandler屬性來獲取實際的ihttphandler物件,通過ihttphandler來處理請求。在mvc中,已經實現了乙個routehandler,即mvcroutehandler,在上例中我們的getroutedata方法使用的即是mvcroutehandler。
iroutehandler介面只有乙個方法:gethttphandler它返回乙個ihttphandler物件。也就是說最終頁面的生成是在ihttphandler物件中實現的。對應於mvc,mvcroutehandler的gethttphandler方法返回乙個mvchandler物件,mvchandler物件負責呼叫合適的controller與action方法。
下面我們沿用上例,實現乙個ieroutehandler,通過這個handler來處理來自ie瀏覽器的請求。
1、新增乙個ieroutehandler類,繼承自iroutehandler,實現其gethttphandler方法,返回乙個iehandler物件。
顯示行號 複製** ? ieroutehandler
2、修改myroute的getroutedata方法,將之前的mvcroutehandler修改為ieroutehandler
顯示行號 複製** ? myroute
}三、irouteconstraint
irouteconstraint介面由route類的constraints屬性使用,用於判斷當前的url是否符合路由的約束條件。route已經實現了乙個httpmethodconstraint用於限制請求方法,例如:
routes.maproute(
"default", // route name
"//", // url with parameters
new , // parameter defaults
new
);表明此項路由規則必須是post請求才有效,即就算url為home/index形式,符合url規則,但是如果請求是通過的get方法,那此項規則也不滿足,明顯,route的getroutedata方法中會檢查所有的約束條件,如果某項約束條件不滿足仍然會返回null。
irouteconstraint介面有乙個match方法,如果請求上下文符合約束返回true否則返回false。
沿用上例,現在我們通過irouteconstraint來限制ie瀏覽器的訪問:
1、新建類ierouteconstraint,實現其match方法:
顯示行號 複製** ? ierouteconstraint
public class ierouteconstraint : irouteconstraint
#endregion
}2、修改global.asax.cs的registerroutes方法,遮蔽掉之前加入的myroute規則,然後修改預設的maproute:
public static void registerroutes(routecollection routes)
.axd/");
// routes.add("myroute",new myroute());
routes.maproute(
"default", // route name
"//", // url with parameters
new , // parameter defaults
new );}
啟動除錯,如果是ie瀏覽器,將顯示乙個無法找到資源的404錯誤。
MVC中的擴充套件點 一 路由系統簡介
之所以說mvc框架很靈活,在於其擴充套件性很強,幾乎在請求處理管道的任何乙個節點都可以擴充套件。本系列文章將會對擴充套件點進行總結整理,以此增強對mvc框架的了解。mvc是建立在路由系統之上的,所以嚴格上講,路由系統並不屬於mvc框架,路由系統是.net framework 3.5 sp1新增的內容...
MVC中的擴充套件點 一 路由系統簡介
之所以說mvc框架很靈活,在於其擴充套件性很強,幾乎在請求處理管道的任何乙個節點都可以擴充套件。本系列文章將會對擴充套件點進行總結整理,以此增強對mvc框架的了解。mvc是建立在路由系統之上的,所以嚴格上講,路由系統並不屬於mvc框架,路由系統是.net framework 3.5 sp1新增的內容...
MVC中的擴充套件點 六 ActionResult
actionresult是控制器方法執行後返回的結果型別,控制器方法可以返回乙個直接或間接從actionresult抽象類繼承的型別,如果返回的是非actionresult型別,控制器將會將結果轉換為乙個contentresult型別。預設的controlleractioninvoker呼叫acti...