日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)

發(fā)布時(shí)間:2023/12/10 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本系列文章基于ASP.NET MVC Preview5.

有時(shí)候你想在調(diào)用action方法之前或者action方法之后處理一些邏輯,為了支持這個(gè),ASP.NET MVC允許你創(chuàng)建action過濾器。Action過濾器是自定義的Attributes,用來標(biāo)記添加Action方法之前或者Action方法之后的行為到控制器類中的Action方法中。

一些可能用到Action過濾器的地方有:

  • 日志,異常處理
  • 身份驗(yàn)證和授權(quán) - 限制用戶的訪問
  • 輸出緩存 - 保存一個(gè)Action的結(jié)果
  • 網(wǎng)絡(luò)爬蟲的過濾
  • 本地化
  • 動(dòng)態(tài)Action - 將一個(gè)Action注入到控制器中

ASP.NET MVC為我們提供了下面的幾個(gè)Filter接口:

  • IActionFilter
  • IAuthorizationFilter
  • IExceptionFilter
  • IResultFilter

    要實(shí)現(xiàn)一個(gè)Filter,我們需要繼承自FilterAttribute類同時(shí)實(shí)現(xiàn)上面的一個(gè)或幾個(gè)接口:

    public?class?MyFilter?:?FilterAttribute,?IActionFilter,?IResultFilter
    {
    }?

    ?

    這幾個(gè)接口提供的方法如下:

    上圖的方法和Filter接口對(duì)應(yīng)的方法按名稱對(duì)號(hào)入座就可以。

    IActionFilter接口有兩個(gè)方法:

    其中OnActionExecuting在執(zhí)行Action方法之前會(huì)被調(diào)用,OnActionExecuted會(huì)在Action方法執(zhí)行后調(diào)用。注意他們的參數(shù)分別是ActionExecutingContext和ActionExecutedContext。

    ActionExecutedContext類包含一個(gè)?Canceled的屬性,允許你取消當(dāng)前的Action(怎么原來在P3中是在ActionExecutingContext的Canceled屬性在P5中沒有了呢?神奇.那么在OnActionExecuting的時(shí)候怎么取消一個(gè)Action呢?)。

    FilterExcutedContext 類包含一個(gè)Exception屬性和一個(gè)ExceptionHandled屬性。如果Exception屬性為null,則沒有異常在action stack中,表明Action方法運(yùn)行并沒有發(fā)生錯(cuò)誤。反之則為出現(xiàn)異常。如果將ExceptionHandled屬性設(shè)置為true則表明在這個(gè)Filter中已經(jīng)處理了異常。

    IResultFilter接口也提供了兩個(gè)方法:

    轉(zhuǎn)存失敗重新上傳取消

    他們分別在Action返回結(jié)果(例如return View();)之前和之后執(zhí)行。和IActionFilter差不多就不多說了。

    IAuthorizationFilter是一個(gè)用于身份驗(yàn)證的Filter。只提供了一個(gè)void OnAuthorization(AuthorizationContext filterContext)方法。

    IExceptionFilter會(huì)在出現(xiàn)異常的時(shí)候調(diào)用,也是只 提供一個(gè)void OnException(ExceptionContext filterContext)的方法;

    這些Filter可以被應(yīng)用在類或者方法上,下面我們來看一下他們的執(zhí)行順序。首先我們寫一個(gè)BaseController并加上兩個(gè)Filter:

    [MyFilter2(Target?=?"BaseController")]
    [MyFilter1(Target
    ="BaseController")]
    public?class?BaseController?:?Controller
    {?
    }?

    ?

    應(yīng)為Controller類是實(shí)現(xiàn)這幾個(gè)Filter接口的,所以我們?cè)贖omeController中重寫Controller基類中的所有Filter接口的方法,并在HomeController類和里面的Filter方法加上我們自定義的MyFilter:


    [MyFilter2(Target?=?"HomeController")]
    //[MyFilter1(Target?=?"HomeController")]//注意我在這里把MyFilter1注釋了.
    [HandleError]
    public?class?HomeController?:?BaseController
    {
    ????[MyFilter2(Target?
    =?"HomeController.Filter")]
    ????[MyFilter1(Target?
    =?"HomeController.Filter")]
    ????
    public?ActionResult?Filter()
    ????{
    ????????
    return?Content("<div>這是在Action方法里面返回的內(nèi)容!</div>");
    ????}?

    ????
    protected?override?void?OnActionExecuted(ActionExecutedContext?filterContext)
    ????{
    ????????filterContext.HttpContext.Response.Write(
    "<div>這是在HomeController里面重寫OnActionExecuted方法添加的內(nèi)容!</div>");
    ????}?

    ????
    protected?override?void?OnActionExecuting(ActionExecutingContext?filterContext)
    ????{
    ????????filterContext.HttpContext.Response.Write(
    "<div>這是在HomeController里面重寫OnActionExecuting方法添加的內(nèi)容!</div>");
    ????}?

    ????
    protected?override?void?OnAuthorization(AuthorizationContext?filterContext)
    ????{
    ????????filterContext.HttpContext.Response.Write(
    "<div>這是在HomeController里面重寫OnAuthorization方法添加的內(nèi)容!</div>");
    ????}?

    ????
    protected?override?void?OnException(ExceptionContext?filterContext)
    ????{
    ????????filterContext.HttpContext.Response.Write(
    "<div>這是在HomeController里面重寫OnException方法添加的內(nèi)容!</div>");
    ????????filterContext.ExceptionHandled?
    =?true;
    ????}?

    ????
    protected?override?void?OnResultExecuted(ResultExecutedContext?filterContext)
    ????{
    ????????filterContext.HttpContext.Response.Write(
    "<div>這是在HomeController里面重寫OnResultExecuted方法添加的內(nèi)容!</div>");
    ????}?

    ????
    protected?override?void?OnResultExecuting(ResultExecutingContext?filterContext)
    ????{
    ????????filterContext.HttpContext.Response.Write(
    "<div>這是在HomeController里面重寫OnResultExecuting方法添加的內(nèi)容!</div>");
    ????}
    }?

    然后我們運(yùn)行一下看看結(jié)果如何:

    從運(yùn)行結(jié)果我們可以看到,在Controller中重寫的Filter會(huì)最先執(zhí)行,然后到應(yīng)用在類上的Filter,然后再到應(yīng)用在類方法上的Filter。

    而4個(gè)接口的方法執(zhí)行順序如下:IAuthorizationFilter ->?IActionFilter ->?IResultFilter ->?IExceptionFilter?.

    而對(duì)于同一個(gè)Filter,例如IAuthorizationFilter在MyFilter1和MyFilter2里里面的實(shí)現(xiàn),又根據(jù)他們的加載順序不同而不同。

    在BaseController中應(yīng)用的Filter會(huì)被子類繼承,如果子類又應(yīng)用了和基類同樣的Filter,則會(huì)不執(zhí)行基類的Filter。例如上面的HomeController應(yīng)用了MyFilter2,所以調(diào)用HomeController的MyFilter2,而不是BaseController的MyFilter2。

    這個(gè)執(zhí)行順序還得大家好好研究才能了解的。

    同時(shí)FilterAttribute還提供了一個(gè)Order的屬性,用于指定Filter的執(zhí)行順序。

    每一個(gè)Action過濾器都有一個(gè) Order 屬性,用來決定Action過濾器在該范圍內(nèi)的執(zhí)行順序。Order屬性必需是0(默認(rèn)值)或者更大的整數(shù)值。省略O(shè)rder屬性則會(huì)給該過濾器的Order值為 -1, 表明未指明順序。任何一個(gè)在同一范圍的Action過濾器Order設(shè)為 -1 的都將按不確定的順序執(zhí)行,但在此之前過濾器有一個(gè)特定的順序(請(qǐng)參考上圖).

    當(dāng)設(shè)置Order屬性的值的時(shí)候,必需指定一個(gè)唯一的值。如果兩個(gè)或者更多的Action過濾器具有相同的Order屬性值,將會(huì)拋出一個(gè)異常。

    來看一個(gè)示例:

    [Filter1(Order?=?2)]
    [Filter2(Order?
    =?3)]
    [Filter3(Order?
    =?1)]
    public?void?Index()
    {
    ????RenderView(
    "Index");
    }?

    ?

    Filter的執(zhí)行順序?yàn)?#xff1a;Filter3 => Filter1 => Filter2.

    暫時(shí)就寫這么多吧,這一部分主要介紹概念。Enjoy!Post by?Q.Lee.lulu。

    本文的Blog程序示例代碼:?ActionFilter.rar

總結(jié)

以上是生活随笔為你收集整理的ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。