綠色資源網(wǎng):您身邊(biān)最放心的安全下(xià)載站! 最新軟件|熱門排行|軟(ruǎn)件分(fèn)類|軟件專題|廠商大(dà)全

綠色資源網

技術教程
您(nín)的位置:首頁網絡編程.Net編程(chéng) → ASP.NET MVC中你必須知道的(de)13個擴展點

ASP.NET MVC中你必須知道的13個擴展點

我要評論 2009/06/13 17:19:32 來源:綠色資源網 編輯:佚名 [ 小(xiǎo)] 評論:0 點(diǎn)擊:757次

ScottGu在(zài)其(qí)最新的博文中(zhōng)推薦了Simone Chiaretta的文(wén)章13 ASP.NET MVC extensibility points you have to know,該文章(zhāng)為我(wǒ)們簡單介紹了ASP.NET MVC中的13個擴展點。Keyvan Nayyeri(與Simone合著了Beginning ASP.NET MVC 1.0一書)又陸續發表了一些(xiē)文章,對這13個擴展點分別進行(háng)深入的討論。我將在以後的隨筆中(zhōng)對這些文章逐一進行翻譯,希望(wàng)能對大家有所幫助。

ASP.NET MVC設計的主要(yào)原則之一是可擴展性。處理管線(processing pipeline)上的所有(或(huò)大多數)東西都是可(kě)替換的。因此,如果您不喜歡ASP.NET MVC所(suǒ)使用的約定(或缺乏某些約定),您可以創建自己的服務來支持您(nín)的約定(dìng),並將其注入到主管線中。

在本文中(zhōng),我們將從管線開始直到視圖呈現,逐一向您展示每個ASP.NET MVC開發者都必須(xū)了解13個擴展點。

1.RouteConstraint

通常情(qíng)況(kuàng)下你可以使用正則表達式(shì)對url參(cān)數進行約束,但如果您的約束不僅(jǐn)僅取決(jué)於單一參數,您可以(yǐ)實現IRouteConstrains的(de)方法,並在其中添加你的驗證邏輯。

比(bǐ)如對日期的驗證,url中可能會包(bāo)含年、月、日,而你需要驗證這三者是(shì)否可以組合成一個有效的日期(qī)。

2.RouteHandler

RouteHandler是在路由選擇之後進行處理的組件,它並不僅僅針對ASP.NET MVC。顯然,如果您改變了RouteHandler,那麽對請求的處理將不再使用(yòng)ASP.NET MVC,但這在您使用其他HttpHandler或經(jīng)典的WebForm進行路由處理時卻是非常有用的(de)。

3.ControllerFactory

ControllerFactory是基於路由的組件,它選擇正確的controller並對(duì)其實(shí)例化。default factory會查找實現了IController並(bìng)且以Controller結尾的類,然(rán)後(hòu)通過反射使用無參構造函數(shù)進行實例化。

但如果您希望使用依賴注入,就不能再使用default factory,而必須使用支持(chí)IoC的(de)controller factory。MvcContrib和Ninject Controller Factory都包含支持(chí)IoC容器(qì)的controller factory。

4.ActionInvoker

ActionInvoker顧名思義是負責調用(invoke)action的。默(mò)認的action invoker通過方法名、action名或其他可能(néng)的selector attribute來查找action,然後調用action方法以(yǐ)及定義的filter,最終執行得到(dào)action result。

你會發現大部分執行管線存在於ControllerActionInvoker類的邏輯之中。因此,如果希望改(gǎi)變這些約定,如action方法(fǎ)的選擇邏輯、http參數映射到action參數的方(fāng)式、選擇和執行filter的方式等(děng),您需要擴展該類並重(chóng)寫需(xū)要修(xiū)改的方法(fǎ)。

可以參閱NinjectActionInvoker I developed to allow injection of dependencies inside filters。

5.ActionMethodSelectorAttribute

使用默認的(de)action invoker時,action的選(xuǎn)擇是基於名(míng)稱的。您也可以實現自己的Method Selector以改善對(duì)於action的選擇。在框架中已經(jīng)包含了AcceptVerbs特性,它允許您指定(dìng)使用哪一個HTTP Verb來處理action的響應(yīng)。

例如,您也許(xǔ)會希望基於瀏覽器所(suǒ)支持的語言或瀏覽器(qì)類型(如移動設備的瀏覽器或(huò)桌麵瀏(liú)覽器)來進行action的選取。

6.AuthorizationFilter

這種過濾器是在action執行之前執行的,用來(lái)確保請求是有效的。

框架中已經包含了一些autorization過濾器,最有名的(de)莫(mò)過於Authorize特性,它用來檢查當前用戶是(shì)否允許執行該action。另一個(gè)是用來阻止CSRF攻擊(jī)的ValidateAntiForgeryToken。如(rú)果您希望實現自己的authorization,那麽必須實現接口。例如,日期中的(de)小時。

7.ActionFilter

Action Filters在action執行前後執行。OutputCache過濾器是幾(jǐ)個核心過濾器之一。這(zhè)可能是您最有可能使用的擴(kuò)展點,並且在(zài)我看來,controller隻(zhī)關心它的主(zhǔ)要工作,而(ér)view所需要的所有其(qí)他數(shù)據都必須從action過濾器內部(bù)獲取,這樣的實現對於一(yī)個組織良好的view來(lái)說,是十分關鍵的。

8.ModelBinder

默認的(de)model binder使用參數名稱進行HTTP參數到action方法參數的映射。例如(rú),http參數user.address.city將映射到方法參數user的(de)Address屬性的City屬性。DefaultModelBinder也同樣適用於數組和(hé)其他列表(biǎo)類型(xíng)。

更進一步來說,例如,您可能希望從數據庫中進行檢索,直接根據person的id將其轉換為Person對象。Timothy Khouri(網名SingingEels)在他的文章Model Binders in ASP.NET MVC中(zhōng)更好的闡述了這種方法。他(tā)的代碼基於Preview 5,但其理念是一(yī)樣的。

9.ControllerBase

所有的Controller均繼承自(zì)基類Controller。要想在action中封裝自(zì)己的邏輯和約定,創建(jiàn)自己的父類使所有Controller繼承自該類,是一種很好的方式。

10.ResultFilter

與(yǔ)ActionFilter類(lèi)似,ResultFilters在ActionResult前後執行。OutputCache過濾器也可以作(zuò)為ResultFilter的示例。另外(wài),比較常用的(de)詮釋這種過濾器的示例是日誌記錄。如果(guǒ)您希望在頁麵返回給用戶(hù)時(shí)記錄日誌,可以編寫自定義的RenderFilter,在ActionResult執行之後記(jì)錄日誌。

11.ActionResult

ASP.NET MVC提供了很多result用來呈(chéng)現視圖、JSON、純文本、文件並重定向(xiàng)到其他action。如果(guǒ)您需(xū)要其他(tā)類型的result,可(kě)以自定義ActionResult,並實現(xiàn)ExecuteResult方法。例(lì)如,如果您希(xī)望將PDF文件(jiàn)作為結果發送,您需要使(shǐ)用PDF庫編寫能(néng)夠生成PDF的ActionResult。又如RSS feed,可參見(jiàn)how to write a RssResult in this post。

12.ViewEngine

您(nín)可能不需要編寫自己的view engine,但您(nín)也許可以考慮使用其他引擎來替代默認(rèn)的WebForm view engine。在我看來,最有趣的引擎就是Spark。

如(rú)果您確實希望編寫自己的view engine,可以看一下Brad Wilson的文章: Partial Rendering & View Engines in ASP.NET MVC。

13.HtmlHelper

視(shì)圖必須十分簡單整潔,它們隻能包含html標記並(bìng)調用HtmlHelper的輔助方法。視圖中不能包(bāo)含任何代碼,所以輔助方法必須十分方(fāng)便,使您(nín)可以將代碼從視圖中提取(qǔ)出來,放到一(yī)個可測試的環境中去。正如Rob Conery所說:如果有if,就構造輔助方法(If there's an IF, make a Helper)。

什麽是HtmlHelper輔助方法?其實(shí)就是HtmlHelper類的擴展方法(fǎ),這是唯一的要求。

你可以(yǐ)從Rob的文章Avoiding Tag Soup中了解到為什麽說HtmlHelper是封裝視圖中代碼(mǎ)的好方法。

在(zài)您的應用中該使用哪個呢?

正如您所猜測的那樣,並不是(shì)所有的應用都需要擴展以上(shàng)的13個擴(kuò)展點。最可能在所有應(yīng)用中進行擴(kuò)展的是ActionFilter和HtmlHelper。另外,您很(hěn)可能會(huì)使用其他人編寫的擴展,如使用了IoC容器的ControllerFactory或用來擺脫WebForm的ViewEngine。

但是(shì),學習這些擴展點並進行嚐(cháng)試是十分重要的,這樣您才會做出選擇,並(bìng)隨時準備在必要的時候使用這些強大的擴展點。下周我將發表一些文章來闡述如何(hé)使用(yòng)這(zhè)些擴展點。

如(rú)果您想詳細了解更多關於該話題(tí)的內(nèi)容,可以考慮購買即將出版的Beginning ASP.NET MVC(我是作者之一)或Professional ASP.NET MVC(ASP.NET MVC開發(fā)團隊編寫)或(huò)ASP.NET MVC in Action (Jeffrey Palermo和Ben Scheirman著)。

我是否遺漏了某些您認為重要的擴展點呢?您是否使用過(guò)我上麵(miàn)提到的(de)擴展點呢?我很(hěn)想聽聽您所遇到的場景。

關鍵詞(cí):ASP.NET

閱讀本文後您有什麽感(gǎn)想? 已有 人(rén)給出評價!

  • 1 歡(huān)迎喜歡
  • 2 白癡
  • 2 拜托
  • 1 哇
  • 1 加油
  • 1 鄙視
免费人欧美成又黄又爽的视频丨一本色道久久88综合日韩精品丨国产专区日韩精品欧美色丨午夜无遮挡男女啪啪视频丨国产欧美日韩综合精品一区二区丨亚洲精品无码不卡在线播HE丨亚洲精品国产精品国自产观看丨日韩国产高清av不卡