阅读文章

Asp.net Mvc Framework 七 (Filter及其执行顺序) 应用于Acti

[日期:2008-03-13] 来源:  作者: [字体: ]

    
  
  在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的具体生存周期
  这是官方站的一数据.
  
  来自controller虚方法 的OnActionExecuting .
  
  应用于当前Controller的Filter中的OnActionExecuting:
  
  先执行基类的,后执派生类的
  执行应用于Action的Filter的OnActionExecuting顺序:
  
  先执行基类的,后执派生类的
  
  
  Action 方法
  
  
  应用于Action的Filter的OnActionExecuted 的执行顺序
  
  
  先执行派生类的,后执行基类的
  应用于当前Controller的Filter中的OnActionExecuted方法
  
  先执行派生类的,后执行基类的
  Controller中的虚方法 OnActionExecuted
  
  
  示例可见http://quickstarts.ASP.net/3-5-extensions/mvc/ActionFiltering.ASPx
  ASP.net Mvc Framework 系列
    


阅读:
录入:blue1000

评论 】 【 推荐 】 【 打印
上一篇:蛙蛙推荐:windbg里查看DateTime值
下一篇:在特定情况下的简单SSO实现方案
相关文章      
本文评论
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款