MVC中的擴充套件點 一 路由上的擴充套件

2021-05-28 17:39:55 字數 3876 閱讀 8955

原文出處:

一、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...