熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

13個不可不知的ASP.NET MVC擴展點

2022-06-13   來源: .NET編程 

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

  在本文中我們將從管線開始直到視圖呈現逐一向您展示每個ASPNET MVC開發者都必須了解個擴展點

  ASPNET MVC擴展之RouteConstraint

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

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

  ASPNET MVC擴展之RouteHandler

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

  ASPNET MVC擴展之ControllerFactory

  ControllerFactory是基於路由的組件它選擇正確的controller並對其實例化 default factory會查找實現了IController並且以Controller結尾的類然後通過反射使用無參構造函數進行實例化

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

  ASPNET MVC擴展之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

  ASPNET MVC擴展之ActionMethodSelectorAttribute

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

  例如您也許會希望基於浏覽器所支持的語言或浏覽器類型(如移動設備的浏覽器或桌面浏覽器)來進行action 的選取

  ASPNET MVC擴展之AuthorizationFilter

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

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

  ASPNET MVC擴展之ActionFilter

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

  ASPNET MVC擴展之ModelBinder

  默認的model binder使用參數名稱進行HTTP參數到action方法參數的映射例如http參數useraddresscity將映射到方法參數 user的Address屬性的City屬性DefaultModelBinder也同樣適用於數組和其他列表類型

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

  ASPNET MVC擴展之ControllerBase

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

  ASPNET MVC擴展之ResultFilter

  與ActionFilter類似ResultFilters在ActionResult前後執行 OutputCache過濾器也可以作為ResultFilter的示例另外比較常用的诠釋這種過濾器的示例是日志記錄如果您希望在頁面返回給用戶 時記錄日志可以編寫自定義的RenderFilter在ActionResult執行之後記錄日志

  ASPNET MVC擴展之ActionResult

  ASPNET MVC提供了很多result用來呈現視圖JSON純文本文件並重定向到其他action如果您需要其他類型的result可以自定義 ActionResult並實現ExecuteResult方法例如如果您希望將PDF文件作為結果發送您需要使用PDF庫編寫能夠生成PDF的 ActionResult

  ASPNET MVC擴展之ViewEngine

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

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

  ASPNET MVC擴展之HtmlHelper

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

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

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

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

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

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


From:http://tw.wingwit.com/Article/program/net/201311/13180.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.