成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 后端
本文介紹了13個ASP.NET MVC擴展點,是每個ASP.NET MVC開發者都必須了解的。當然,并不是所有的應用都需要擴展以上的13個擴展點。最可能在所有應用中進行擴展的是ActionFilter和HtmlHelper。

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

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

1.ASP.NET MVC擴展之RouteConstraint

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

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

2.ASP.NET MVC擴展之RouteHandler

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

3.ASP.NET MVC擴展之ControllerFactory

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

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

4.ASP.NET 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。

5.ASP.NET MVC擴展之ActionMethodSelectorAttribute

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

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

6.ASP.NET MVC擴展之AuthorizationFilter

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

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

7.ASP.NET MVC擴展之ActionFilter

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

8.ASP.NET MVC擴展之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.ASP.NET MVC擴展之ControllerBase

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

10.ASP.NET MVC擴展之ResultFilter

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

11.ASP.NET MVC擴展之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.ASP.NET MVC擴展之ViewEngine

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

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

13.ASP.NET MVC擴展之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。

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

【編輯推薦】

  1. ASP.NET MVC分頁功能實現:PagedList
  2. 為ASP.NET MVC應用添加自定義路由
  3. 學習ASP.NET MVC路由的使用方法
  4. 淺析ASP.NET中的URL Rewrite
  5. 淺談ASP.NET MVC框架
責任編輯:yangsai 來源: Scott Gu博客中文版
相關推薦

2023-06-26 14:11:06

SQLC++語言

2024-03-21 08:57:39

語言軟件開發

2010-06-11 14:46:38

可路由協議

2023-09-20 09:00:00

2023-11-13 14:19:57

Golang編程語言

2023-09-22 12:14:33

2021-08-12 16:02:22

Jupyter NotPython命令

2023-09-08 10:23:13

JavaScriptNPM模塊

2020-11-30 13:12:04

Linux文本命令

2015-01-15 09:34:28

2015-06-10 10:56:50

iOS開發技巧

2023-06-15 11:01:43

Java工具開源

2023-09-27 18:02:31

2015-07-28 16:48:04

云計算性能測試云服務

2024-09-23 21:05:45

2020-11-11 21:27:55

緩沖文件調用

2010-04-16 17:09:18

Oracle查看鎖

2025-01-03 17:10:54

2019-12-02 14:14:20

緩沖系統調用函數

2018-06-12 11:05:33

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 蜜桃视频在线观看www社区 | 一区二区三区国产好的精 | 国产高清精品一区二区三区 | 亚洲一区二区三区四区五区中文 | 91精品国产一区二区三区动漫 | 午夜一区二区三区在线观看 | 成人小视频在线观看 | 毛片入口 | 一区二区视频在线 | 日韩一区欧美一区 | 精品国产一区二区三区性色 | 在线免费看黄 | 91国产在线视频在线 | 国产精品久久久久久久久久免费看 | 玖玖精品 | 久久激情视频 | 日韩欧美三区 | 久久精品国产亚洲 | av中文字幕在线播放 | a国产一区二区免费入口 | 亚洲成人精品影院 | 夜夜爽99久久国产综合精品女不卡 | 亚洲成人毛片 | 久久91精品国产一区二区三区 | 国产小u女发育末成年 | 精品久久久久久久 | h视频免费看 | av久久| 日韩精品一区二区三区免费视频 | 国产一区二区三区精品久久久 | 少妇一级淫片免费播放 | 久久久美女 | 精品乱码一区二区 | 国产午夜精品一区二区三区 | 亚洲国产精品一区二区三区 | 四虎网站在线观看 | 久久天天躁狠狠躁夜夜躁2014 | 成人免费视频观看视频 | 久久久国 | 农村真人裸体丰满少妇毛片 | 逼逼网 |