asp.net MVC之Action过滤器浅析

在asp.net MVC中,Action过滤器是一大利器,它可以在以下两个步骤执行相关的代码:

1.执行Action方法之前:OnActionExecuting

2.Action方法执行完毕后:OnActionExecuted

一般我们自定义的Action过滤器会继承FilterAttribute类和IActionFilter接口。

FilterAttribute类有两个关键属性:

AllowMultiple:布尔型,指示是否可指定筛选器特性的多个实例。如果可指定筛选器特性的多个实例,则为 true;否则为 false。

Order:int整型,获取或者设置执行操作筛选器的顺序。该属性后面会讲到。

IActionFilter接口有两个关键方法:

void OnActionExecuting(ActionExecutingContext filterContext):在进入Action之前执行该方法。

void OnActionExecuted(ActionExecutedContext filterContext):Action方法执行完毕之后立刻执行该方法。

接下来让我们用代码亲自实践。

首先自定义一个Action过滤器:

    public class MyFirstActionFilterAttribute : FilterAttribute, IActionFilter {
        public void OnActionExecuting(ActionExecutingContext filterContext) {
            filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:black;color:white;‘>{2} OnActionExecuting {0} {1}</h4>",
                filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, this.GetType().Name));
        }

        public void OnActionExecuted(ActionExecutedContext filterContext) {
            filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:black;color:white;‘>{2} OnActionExecuted {0} {1}</h4>",
                filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName,GetType().Name));
        }
    }

接着我们将该方法过滤器附加到一个Action上:

        [MyFirstActionFilter]
        public ActionResult ActionFilterTest() {
            Response.Write("进入Action方法");
            return  new EmptyResult();
        }

执行结果如下:

执行的顺序果然是 OnActionExecuting》Action》OnActionExecuted。

如果有很多Action过滤器附加到一个Action方法上,那么执行的顺序又是怎样的呢?相当于自上而下压栈式执行,可以将OnActionExecuting当做左大括号,OnActionExecuted当做右大括号。

我们继续自定义两个Action过滤器来实践一下:

    public class MySecondActionFilterAttribute : FilterAttribute, IActionFilter {
        public void OnActionExecuting(ActionExecutingContext filterContext) {

            filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:yellow;color:red;‘>{2} OnActionExecuting {0} {1}</h4>",
                filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, this.GetType().Name));
        }

        public void OnActionExecuted(ActionExecutedContext filterContext) {
            filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:yellow;color:red;‘>{2} OnActionExecuted {0} {1}</h4>",
                filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, GetType().Name));
        }
    }
    public class MyThirdActionFilterAttribute : FilterAttribute, IActionFilter {
        public void OnActionExecuting(ActionExecutingContext filterContext) {
            filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:aliceblue;color:blue;‘>{2} OnActionExecuting {0} {1}</h4>",
                filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, this.GetType().Name));
        }

        public void OnActionExecuted(ActionExecutedContext filterContext) {
            filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:aliceblue;color:blue;‘>{2} OnActionExecuted {0} {1}</h4>",
                 filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, GetType().Name));
        }
    }

附加到同一个Action方法上:

        [MyFirstActionFilter]
        [MySecondActionFilter]
        [MyThirdActionFilter]
        public ActionResult ActionFilterTest() {
            Response.Write("进入Action方法");
            return  new EmptyResult();
        }

执行的结果如下图所示:

执行的顺序果然是自上而下、压栈式执行。这是默认的方式。

我们还可以通过设置每个Action过滤器的Order属性来自定义它们的执行顺序。这就是Action过滤器需要继承FilterAttribute的原因。

接下来我们打乱每个Action过滤器的位置,并设置每个Action过滤器的Order属性。如下代码:

        [MyThirdActionFilter(Order = 3)]
        [MySecondActionFilter(Order = 2)]
        [MyFirstActionFilter(Order =1)]
        public ActionResult ActionFilterTest() {
            Response.Write("进入Action方法");
            return  new EmptyResult();
        }

运行程序,看一看执行的结果:

果然是根据Order的升序来执行的,且还是压栈式执行。

介绍一个实际的用法。如果遇到跨域的情况,可以在OnActionExecuting方法中判断当前用户码和相关标识,表示是否可以跨域处理。

类似如下代码:

        public void OnActionExecuting(ActionExecutingContext filterContext) {
            bool isAllowCrossDomain = false;
            //判断用户码和相关标识
            //......
            //判断完毕并设置isAllowCrossDomain
            //如果允许跨域
            if (isAllowCrossDomain) {
                //在此返回正确结果
            }
            else {
                //返回错误代码和消息说明
            }
            filterContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        }
时间: 2024-10-17 09:33:25

asp.net MVC之Action过滤器浅析的相关文章

ASP.NET MVC学习之过滤器篇(2)

下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成之后更改最终返回的结果,当然很多人一定不太明白这个到底可以干什么, 下面我们举一个比较实际的例子: 相信理解过网站的安全的一定知道跨站请求(CSRF具体可以自行百度,这里我就不去解释了),当然也有解决方案,那就是给页面中增加一个识别码,当页面进行POST请求时,首先判断识别码是否正确, 如果正确则继

ASP.NET MVC学习之过滤器(一)

一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC 4之上(VS2012) 1.授权过滤器 只要涉及用户的网站,都一定会涉及到什么权限的用户可以访问哪个页面.对于新手而言可能都在每个页面中单独写这个功能方法,导致的后果就是大量重复的代码,并且不便于以后的变动.有用一定经验之后,就会采用集中控制的方式,让所有的页面先执行特定的方法去判断,这样的优点就

NHibernate中Session与ASP.NET MVC中Action的综合使用

NHibernate的基本特征是完成面向对象的程序设计语言到关系数据库的映射,在NHibernate中使用持久化对象PO(Persistent Object)完成持久化操作,对PO的操作必须在Session管理下才能同步到数据库, 但是这里的Session并非指HttpSession,可以理解为基于ADO.NET的Connnection,Session是NHibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session息息相关,首先,我们需要知道, SessionFact

ASP.NET MVC – 关于Action返回结果类型的事儿(上)

原文:ASP.NET MVC – 关于Action返回结果类型的事儿(上) 本文转自:博客园-文超的技术博客 一.         ASP.NET MVC 1.0 Result 几何? Action的返回值类型到底有几个?咱们来数数看. ASP.NET MVC 1.0 目前一共提供了以下十几种Action返回结果类型: 1.       ActionResult(base) 2.       ContentResult 3.       EmptyResult 4.       HttpUnau

asp.net MVC之 自定义过滤器(Filter) - shuaixf

一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以秒为单位 ,理论上缓存时间可以很长,但实际上当系统资源紧张时,缓存空间还是会被系统收回. VaryByParam :以哪个字段为标识来缓存数据,比如当"ID"字段变化时,需要改变缓存(仍可保留原来的缓存),那么应该设VaryByParam为"ID".这里你可以设置以下几

ASP.NET MVC的Action Filter

一年前写了一篇短文ASP.NET MVC Action Filters,整理了Action Filter方面的资源,本篇文章详细的描述Action Filter.Action Filter作为一个可以应用到Controller Action(或者是整个controller)上的属性(Attribute),改变Action执行的行为,当应用于整个Controller上时,Controller上的所有Action都应用了同样设置的Action. 使用Action Filter 可以处理缓存. 验证和

asp.net mvc 全局权限过滤器及继成权限方法

全局权限过滤器 //----------------------------------------------------------------------- // <copyright file="PermissionFilter.cs" company="STO EXPRESS, Ltd."> // Copyright (c) 2015 , All rights reserved. // </copyright> //--------

ASP.NET MVC 4 (三) 过滤器

先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constructor public ViewResult Index() { if (!Request.IsAuthenticated) { FormsAuthentication.RedirectToLoginPage(); } // ...rest of action method } public Vie

如何在ASP.NET MVC为Action定义筛选器

在ASP.NET MVC中,经常会用到[Required]等特性,在MVC中,同样可以为Action自定义筛选器,来描述控制器所遵守的规则. 首先,我们在ASP.NET MVC项目中定义一个TestController,控制器中包含两个Action动作方法,代码如下: 1 public class TestController : Controller 2 { 3 4 public string FirstPage() 5 { 6 return "请输入ID"; 7 } 8 // 9