解讀ASP.NET MVC中必知的13個(gè)擴(kuò)展點(diǎn)_.Net教程
推薦:解讀一個(gè)簡(jiǎn)單程序的反編譯看了老趙的博客從匯編入手,探究泛型的性能問題 ,突然想起以前自己寫過一個(gè)關(guān)于反匯編的文章,特轉(zhuǎn)過來。 源代碼如下: 以下為引用的內(nèi)容: void
ScottGu在其最新的博文中推薦了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,該文章為我們簡(jiǎn)單介紹了ASP.NET MVC中的13個(gè)擴(kuò)展點(diǎn)。Keyvan Nayyeri(與Simone合著了Beginning ASP.NET MVC 1.0一書)又陸續(xù)發(fā)表了一些文章,對(duì)這13個(gè)擴(kuò)展點(diǎn)分別進(jìn)行深入的討論。我將在以后的隨筆中對(duì)這些文章逐一進(jìn)行翻譯,希望能對(duì)大家有所幫助。
ASP.NET MVC設(shè)計(jì)的主要原則之一是可擴(kuò)展性。處理管線(processing pipeline)上的所有(或大多數(shù))東西都是可替換的。因此,如果您不喜歡ASP.NET MVC所使用的約定(或缺乏某些約定),您可以創(chuàng)建自己的服務(wù)來支持您的約定,并將其注入到主管線中。
在本文中,我們將從管線開始直到視圖呈現(xiàn),逐一向您展示每個(gè)ASP.NET MVC開發(fā)者都必須了解13個(gè)擴(kuò)展點(diǎn)。
1.RouteConstraint
通常情況下你可以使用正則表達(dá)式對(duì)url參數(shù)進(jìn)行約束,但如果您的約束不僅僅取決于單一參數(shù),您可以實(shí)現(xiàn)IRouteConstrains的方法,并在其中添加你的驗(yàn)證邏輯。
比如對(duì)日期的驗(yàn)證,url中可能會(huì)包含年、月、日,而你需要驗(yàn)證這三者是否可以組合成一個(gè)有效的日期。
2.RouteHandler
RouteHandler是在路由選擇之后進(jìn)行處理的組件,它并不僅僅針對(duì)ASP.NET MVC。顯然,如果您改變了RouteHandler,那么對(duì)請(qǐng)求的處理將不再使用ASP.NET MVC,但這在您使用其他HttpHandler或經(jīng)典的WebForm進(jìn)行路由處理時(shí)卻是非常有用的。
3.ControllerFactory
ControllerFactory是基于路由的組件,它選擇正確的controller并對(duì)其實(shí)例化。default factory會(huì)查找實(shí)現(xiàn)了IController并且以Controller結(jié)尾的類,然后通過反射使用無參構(gòu)造函數(shù)進(jìn)行實(shí)例化。
但如果您希望使用依賴注入,就不能再使用default factory,而必須使用支持IoC的controller factory。MvcContrib和Ninject Controller Factory都包含支持IoC容器的controller factory。
4.ActionInvoker
ActionInvoker顧名思義是負(fù)責(zé)調(diào)用(invoke)action的。默認(rèn)的action invoker通過方法名、action名或其他可能的selector attribute來查找action,然后調(diào)用action方法以及定義的filter,最終執(zhí)行得到action result。
你會(huì)發(fā)現(xiàn)大部分執(zhí)行管線存在于ControllerActionInvoker類的邏輯之中。因此,如果希望改變這些約定,如action方法的選擇邏輯、http參數(shù)映射到action參數(shù)的方式、選擇和執(zhí)行filter的方式等,您需要擴(kuò)展該類并重寫需要修改的方法。
可以參閱NinjectActionInvoker I developed to allow injection of dependencies inside filters。
5.ActionMethodSelectorAttribute
使用默認(rèn)的action invoker時(shí),action的選擇是基于名稱的。您也可以實(shí)現(xiàn)自己的Method Selector以改善對(duì)于action的選擇。在框架中已經(jīng)包含了AcceptVerbs特性,它允許您指定使用哪一個(gè)HTTP Verb來處理action的響應(yīng)。
例如,您也許會(huì)希望基于瀏覽器所支持的語言或?yàn)g覽器類型(如移動(dòng)設(shè)備的瀏覽器或桌面瀏覽器)來進(jìn)行action的選取。
6.AuthorizationFilter
這種過濾器是在action執(zhí)行之前執(zhí)行的,用來確保請(qǐng)求是有效的。
框架中已經(jīng)包含了一些autorization過濾器,最有名的莫過于Authorize特性,它用來檢查當(dāng)前用戶是否允許執(zhí)行該action。另一個(gè)是用來阻止CSRF攻擊的ValidateAntiForgeryToken。如果您希望實(shí)現(xiàn)自己的authorization,那么必須實(shí)現(xiàn)接口。例如,日期中的小時(shí)。
7.ActionFilter
Action Filters在action執(zhí)行前后執(zhí)行。OutputCache過濾器是幾個(gè)核心過濾器之一。這可能是您最有可能使用的擴(kuò)展點(diǎn),并且在我看來,controller只關(guān)心它的主要工作,而view所需要的所有其他數(shù)據(jù)都必須從action過濾器內(nèi)部獲取,這樣的實(shí)現(xiàn)對(duì)于一個(gè)組織良好的view來說,是十分關(guān)鍵的。
8.ModelBinder
默認(rèn)的model binder使用參數(shù)名稱進(jìn)行HTTP參數(shù)到action方法參數(shù)的映射。例如,http參數(shù)user.address.city將映射到方法參數(shù)user的Address屬性的City屬性。DefaultModelBinder也同樣適用于數(shù)組和其他列表類型。
更進(jìn)一步來說,例如,您可能希望從數(shù)據(jù)庫(kù)中進(jìn)行檢索,直接根據(jù)person的id將其轉(zhuǎn)換為Person對(duì)象。Timothy Khouri(網(wǎng)名SingingEels)在他的文章Model Binders in ASP.NET MVC中更好的闡述了這種方法。他的代碼基于Preview 5,但其理念是一樣的。
9.ControllerBase
所有的Controller均繼承自基類Controller。要想在action中封裝自己的邏輯和約定,創(chuàng)建自己的父類使所有Controller繼承自該類,是一種很好的方式。
10.ResultFilter
與ActionFilter類似,ResultFilters在ActionResult前后執(zhí)行。OutputCache過濾器也可以作為ResultFilter的示例。另外,比較常用的詮釋這種過濾器的示例是日志記錄。如果您希望在頁面返回給用戶時(shí)記錄日志,可以編寫自定義的RenderFilter,在ActionResult執(zhí)行之后記錄日志。
11.ActionResult
ASP.NET MVC提供了很多result用來呈現(xiàn)視圖、JSON、純文本、文件并重定向到其他action。如果您需要其他類型的result,可以自定義ActionResult,并實(shí)現(xiàn)ExecuteResult方法。例如,如果您希望將PDF文件作為結(jié)果發(fā)送,您需要使用PDF庫(kù)編寫能夠生成PDF的ActionResult。又如RSS feed,可參見how to write a RssResult in this post。
12.ViewEngine
您可能不需要編寫自己的view engine,但您也許可以考慮使用其他引擎來替代默認(rèn)的WebForm view engine。在我看來,最有趣的引擎就是Spark。
如果您確實(shí)希望編寫自己的view engine,可以看一下Brad Wilson的文章: Partial Rendering
13.HtmlHelper
視圖必須十分簡(jiǎn)單整潔,它們只能包含html標(biāo)記并調(diào)用HtmlHelper的輔助方法。視圖中不能包含任何代碼,所以輔助方法必須十分方便,使您可以將代碼從視圖中提取出來,放到一個(gè)可測(cè)試的環(huán)境中去。正如Rob Conery所說:如果有if,就構(gòu)造輔助方法(If there's an IF, make a Helper)。
什么是HtmlHelper輔助方法?其實(shí)就是HtmlHelper類的擴(kuò)展方法,這是唯一的要求。
你可以從Rob的文章Avoiding Tag Soup中了解到為什么說HtmlHelper是封裝視圖中代碼的好方法。
分享:解讀ASP.NET中的IFRAME框架掛馬安全工程師,要能獨(dú)立負(fù)責(zé)網(wǎng)站安全、局域網(wǎng)安全、服務(wù)器安全等,要了解網(wǎng)頁掛馬有IFRAME框架掛馬、JS文件掛馬、偽裝掛馬、CSS掛馬、ActiveX組件掛馬等方式,這樣才可以有針對(duì)性地進(jìn)行防范,避免網(wǎng)站和服務(wù)器等安全威脅。下面,我們來邁出成長(zhǎng)為安全工程師的
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過程實(shí)現(xiàn)分頁示例代碼
- 相關(guān)鏈接:
- 教程說明:
.Net教程-解讀ASP.NET MVC中必知的13個(gè)擴(kuò)展點(diǎn)
。