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

來源:互聯網
上載者:User
文章目錄
  • 1.RouteConstraint
  • 2.RouteHandler
  • 3.ControllerFactory
  • 4.ActionInvoker
  • 5.ActionMethodSelectorAttribute
  • 6.AuthorizationFilter
  • 7.ActionFilter
  • 8.ModelBinder
  • 9.ControllerBase
  • 10.ResultFilter
  • 11.ActionResult
  • 12.ViewEngine
  • 13.HtmlHelper
  • 在您的應用中該使用哪個呢?

ScottGu在其最新的博文中推薦了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,該文章為我們簡單介紹了ASP.NET MVC中的13個擴充點。Keyvan Nayyeri(與Simone合著了Beginning ASP.NET MVC 1.0一書)又陸續發表了一些文章,對這13個擴充點分別進行深入的討論。我將在以後的隨筆中對這些文章逐一進行翻譯,希望能對大家有所協助。

 

ASP.NET MVC設計的主要原則之一是可擴充性。處理管線(processing pipeline)上的所有(或大多數)東西都是可替換的。因此,如果您不喜歡ASP.NET MVC所使用的約定(或缺乏某些約定),您可以建立自己的服務來支援您的約定,並將其注入到主管線中。

在本文中,我們將從管線開始直到視圖呈現,逐一向您展示每個ASP.NET MVC開發人員都必須瞭解13個擴充點。

1.RouteConstraint

通常情況下你可以使用Regex對url參數進行約束,但如果您的約束不僅僅取決於單一參數,您可以實現IRouteConstrains的方法,並在其中添加你的驗證邏輯。

比如對日期的驗證,url中可能會包含年、月、日,而你需要驗證這三者是否可以組合成一個有效日期。

2.RouteHandler

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

3.ControllerFactory

ControllerFactory是基於路由的組件,它選擇正確的controller並對其執行個體化。default factory會尋找實現了IController並且以Controller結尾的類,然後通過反射使用無參建構函式進行執行個體化。

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

4.ActionInvoker

ActionInvoker顧名思義是負責調用(invoke)action的。預設的action invoker通過方法名、action名或其他可能的selector attribute來尋找action,然後調用action方法以及定義的filter,最終執行得到action result。

你會發現大部分執行管線存在於ControllerActionInvoker類的邏輯之中。因此,如果希望改變這些約定,如action方法的選擇邏輯、http參數映射到action參數的方式、選擇和執行filter的方式等,您需要擴充該類並重寫需要修改的方法。

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

5.ActionMethodSelectorAttribute

使用預設的action invoker時,action的選擇是基於名稱的。您也可以實現自己的Method Selector以改善對於action的選擇。在架構中已經包含了AcceptVerbs特性,它允許您指定使用哪一個HTTP Verb來處理action的響應。

例如,您也許會希望基於瀏覽器所支援的語言或瀏覽器類型(如行動裝置的瀏覽器或案頭瀏覽器)來進行action的選取。

6.AuthorizationFilter

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

架構中已經包含了一些autorization過濾器,最有名的莫過於Authorize特性,它用來檢查目前使用者是否允許執行該action。另一個是用來阻止CSRF攻擊的ValidateAntiForgeryToken。如果您希望實現自己的authorization,那麼必須實現介面。例如,日期中的小時。

7.ActionFilter

Action Filters在action執行前後執行。OutputCache過濾器是幾個核心過濾器之一。這可能是您最有可能使用的擴充點,並且在我看來,controller只關心它的主要工作,而view所需要的所有其他資料都必須從action過濾器內部擷取,這樣的實現對於一個組織良好的view來說,是十分關鍵的。

8.ModelBinder

預設的model binder使用參數名稱進行HTTP參數到action方法參數的映射。例如,http參數user.address.city將映射到方法參數user的Address屬性的City屬性。DefaultModelBinder也同樣適用於數組和其他清單類型。

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

9.ControllerBase

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

10.ResultFilter

與ActionFilter類似,ResultFilters在ActionResult前後執行。OutputCache過濾器也可以作為ResultFilter的樣本。另外,比較常用的詮釋這種過濾器的樣本是日誌記錄。如果您希望在頁面返回給使用者時記錄日誌,可以編寫自訂的RenderFilter,在ActionResult執行之後記錄日誌。

11.ActionResult

ASP.NET MVC提供了很多result用來呈現視圖、JSON、純文字、檔案並重新導向到其他action。如果您需要其他類型的result,可以自訂ActionResult,並實現ExecuteResult方法。例如,如果您希望將PDF檔案作為結果發送,您需要使用PDF庫編寫能夠產生PDF的ActionResult。又如RSS feed,可參見how to write a RssResult in this post。

12.ViewEngine

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

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

13.HtmlHelper

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

什麼是HtmlHelper輔助方法?其實就是HtmlHelper類的擴充方法,這是唯一的要求。

你可以從Rob的文章Avoiding Tag Soup中瞭解到為什麼說HtmlHelper是封裝視圖中代碼的好方法。

在您的應用中該使用哪個呢?

正如您所猜測的那樣,並不是所有的應用都需要擴充以上的13個擴充點。最可能在所有應用中進行擴充的是ActionFilter和HtmlHelper。另外,您很可能會使用其他人編寫的擴充,如使用了IoC容器的ControllerFactory或用來擺脫WebForm的ViewEngine。

但是,學習這些擴充點並進行嘗試是十分重要的,這樣您才會做出選擇,並隨時準備在必要的時候使用這些強大的擴充點。下周我將發表一些文章來闡述如何使用這些擴充點。

如果您想詳細瞭解更多關於該話題的內容,可以考慮購買即將出版的Beginning ASP.NET MVC(我是作者之一)或Professional ASP.NET MVC(ASP.NET MVCTeam Dev編寫)或ASP.NET MVC in Action (Jeffrey Palermo和Ben Scheirman著)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.