应用于Action的Filter

在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能
判断登录与否或用户权限,决策输出缓存,防盗链,防蜘蛛,本地化设置,实现动态Action
filter是一种声明式编程方式,在Asp.net MVC中它只能应用在Action上
Filter要继承于ActionFilterAttribute抽象类,并可以覆写void OnActionExecuting(FilterExecutingContext)和
void OnActionExecuted(FilterExecutedContext)这两个方法
OnActionExecuting是Action执行前的操作,OnActionExecuted则是Action执行后的操作

下面我给大家一个示例,来看看它的的执行顺序

首先我们先建立 一个Filter,名字叫做TestFilter

using System.Web.Mvc;

namespace MvcApplication2.Controllers
{
    public class TestFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(FilterExecutingContext
           filterContext) {
            filterContext.HttpContext.Session["temp"] += "OnActionExecuting<br/>";
        }

        public override void OnActionExecuted(FilterExecutedContext
            filterContext) {
            filterContext.HttpContext.Session["temp"] += "OnActionExecuted<br/>";
        }
    }
}

在这里我们在Session["temp"]上标记执行的顺序
我们在Controller中的Action中写以下代码

        [TestFilter]
        public void Index() {
this.HttpContext.Session["temp"] += "Action<br/>";
            RenderView("Index");
        }

在这个Action执行的时候,我们也为Session["temp"]打上了标记.

最后是View的内容
很简单我们只写

<%=Session["temp"] %>

这样我们就可以执行这个页面了
在第一次执行完成后,页面显示

OnActionExecuting
Action

这证明是先执行了OnActionExecuting然后执行了Action,我们再刷新一下页面
则得到

OnActionExecuting
Action
OnActionExecuted
OnActionExecuting
Action

这是因为OnActionExecuted是在第一次页面 显示后才执行,所以要到第二次访问页面时才能看到
Controller的Filter
Monorail中的Filter是可以使用在Controller中的,这给编程者带来了很多方便,那么在Asp.net MVC中可不可以使用Controller级的Filter呢.不言自喻.

实现方法如下Controller本身也有OnActionExecuting与OnActionExecuted方法 ,将之重写即可,见代码

namespace MvcApplication2.Controllers
{
    using System.Web.Mvc;
    public class EiceController : Controller
    {
        public void Index() {        this.HttpContext.Session["temp"] += "Action<br/>";

            RenderView("Index");
        }
        public void Index2() {
            
            RenderView("Index");
        }
        protected override void OnActionExecuting(FilterExecutingContext
           filterContext) {
            filterContext.HttpContext.Session["temp"] += "OnActionExecuting<br/>";
        }

        protected override void OnActionExecuted(FilterExecutedContext
            filterContext) {
            filterContext.HttpContext.Session["temp"] += "OnActionExecuted<br/>";
        }
    }
}

这里要注意一点,这两个方法 一定要protected
要是想多个Controller使用这个Filter怎么办?继承呗.
Filter的具体生存周期
这是官方站的一数据.

  1. 来自controller虚方法 的OnActionExecuting .

  2. 应用于当前Controller的Filter中的OnActionExecuting:

    先执行基类的,后执派生类的

  3. 执行应用于Action的Filter的OnActionExecuting顺序:

    先执行基类的,后执派生类的

  4. Action 方法

  5. 应用于Action的Filter的OnActionExecuted 的执行顺序

    先执行派生类的,后执行基类的

  6. 应用于当前Controller的Filter中的OnActionExecuted方法

    先执行派生类的,后执行基类的

  7. Controller中的虚方法 OnActionExecuted

示例可见http://quickstarts.asp.net/3-5-extensions/mvc/ActionFiltering.aspx
Asp.net Mvc Framework 系列

最新文章

  1. 【ESRI论坛6周年征文】ArcEngine注记(Anno/ Label/Element等)处理专题 -入门篇
  2. 分享一个动态生成RDLC报表的类
  3. 【转】ACM训练计划
  4. 利用 Process Monitor 找出某个 Windows 选项所对应的注册表值
  5. 关于CSS的那些事?
  6. android桌面快捷方式跳转到指定activity
  7. Codeforces 424A (思维题)
  8. struts2 知识梳理
  9. 使用GPUImage开启的相机进行摄像,保存写入到Path
  10. [Angular 2] Handling Clicks and Intervals Together with Merge
  11. .Net框架与框架类库-转
  12. leetcode: sortlist之四种方法
  13. 反射实现IOC功能
  14. 实用开发之-oracle表回滚到一个指定时间的操作语句
  15. [Android FrameWork 6.0源码学习] View的重绘过程之Draw
  16. Centos 7 安装 memcached
  17. MyBatis3系列__03几个常用的属性配置
  18. 基础才是重中之重~lock和monitor的区别
  19. laravel框架中的邮箱发送
  20. 14-background

热门文章

  1. Running multiple instances of Xamarin Studio on a Mac
  2. [深入浅出iOS库]之图形库CorePlot
  3. .NET:之前用过的一个技术架构
  4. Spring+Quartz的版本问题
  5. UILabel混合显示动画效果
  6. UIScrollView视差效果动画
  7. Log4j按级别输出日志到不同文件配置分析
  8. TR069协议小结
  9. OTL翻译(9) --常量的SQL语句
  10. python 数据处理中的 LabelEncoder 和 OneHotEncoder