码迷,mamicode.com
首页 > Web开发 > 详细

MVC4 过滤器使用和怎样控制全部action和部分action

时间:2014-06-30 11:43:30      阅读:370      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   get   

MVC中的过滤器分四种分别为:IActionFilter(动作过滤器), IAuthorizationFilter(授权过滤器), IExceptionFilter(异常过滤器), IResultFilter(结果过滤器)字面翻译,凑合理解吧。

在此就那IActionFilter举例,在这个接口中有两个方法,分别是:OnActionExecuting(Action执行前执行)和OnActionExecuted(Action执行后执行),

bubuko.com,布布扣

现在我们要想让一个Controller中的所有Action都执行这个过滤器就需要对里面的方法进行重写

bubuko.com,布布扣
  public class LoginController : Controller
    {
        //
        // GET: /Login/
        public ActionResult Index()
        {
            return View();
        }
  
        public ActionResult Login()
        {
            string name = HttpContext.Request["UserName"];
            ViewData["name"] = name;
            return View();
        }
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true);
            //if (attrs.Length == 1)//有NoFilter属性
            //{
            //    return;
            //}

            string name = filterContext.HttpContext.Request["UserName"];
            if (string.IsNullOrEmpty(name))
            {
                filterContext.HttpContext.Response.Write("<script>alert(‘名称不能为空!‘);</script>");
                filterContext.HttpContext.Response.End();
            }
        }
    }
View Code

这样每个action在执行前都会先执行这个过滤器。

 

下面是怎样让Index的Action不执行,只是对Login执行。有2种方式实现:

第一种:代码修改如下:

bubuko.com,布布扣
 public class LoginController : Controller
    {
        //
        // GET: /Login/
        [NoFilter]
        public ActionResult Index()
        {
            return View();
        }
        
        public ActionResult Login()
        {
            string name = HttpContext.Request["UserName"];
            ViewData["name"] = name;
            return View();
        }
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //过滤掉标有NoFilter标签的Action
            object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true);
            if (attrs.Length == 1)//有NoFilter属性
            {
                return;
            }

            string name = filterContext.HttpContext.Request["UserName"];
            if (string.IsNullOrEmpty(name))
            {
                filterContext.HttpContext.Response.Write("<script>alert(‘名称不能为空!‘);</script>");
                filterContext.HttpContext.Response.End();
            }
        }
    }
    public class NoFilter : FilterAttribute, IActionFilter
    {
        public  void OnActionExecuting(ActionExecutingContext filterContext)
        {
           //
        }
        public  void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //
        }
    }
View Code

第二种:代码修改如下:

bubuko.com,布布扣
 public class LoginController : Controller
    {
        //
        // GET: /Login/
        public ActionResult Index()
        {
            return View();
        }
        [LoginFilter]
        public ActionResult Login()
        {
            string name = HttpContext.Request["UserName"];
            ViewData["name"] = name;
            return View();
        }
        //protected override void OnActionExecuting(ActionExecutingContext filterContext)
        //{
        //    //过滤掉标有NoFilter标签的Action
        //    object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilter), true);
        //    if (attrs.Length == 1)//有NoFilter属性
        //    {
        //        return;
        //    }

        //    string name = filterContext.HttpContext.Request["UserName"];
        //    if (string.IsNullOrEmpty(name))
        //    {
        //        filterContext.HttpContext.Response.Write("<script>alert(‘名称不能为空!‘);</script>");
        //        filterContext.HttpContext.Response.End();
        //    }
        //}
    }
    public class LoginFilter : FilterAttribute, IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext filterContext)
        {

            string name = filterContext.HttpContext.Request["UserName"];
            if (string.IsNullOrEmpty(name))
            {
                filterContext.HttpContext.Response.Write("<script>alert(‘名称不能为空!‘);</script>");
                filterContext.HttpContext.Response.End();
            }
        }
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //
        }
    }
View Code

补充:1.自定义过滤器Filter必须继承FilterAttribute。

   2.定义过个过滤器可以定义过滤器执行的先后顺序 例如: 在Action上标注:

           [NoFilter(Order=2)]

           [LoginFilter(Order=1)]

         这样当执行这个Action时候会先执行LoginFilter 再执行NoFilter。

 

 

 

 

MVC4 过滤器使用和怎样控制全部action和部分action,布布扣,bubuko.com

MVC4 过滤器使用和怎样控制全部action和部分action

标签:des   style   blog   http   color   get   

原文地址:http://www.cnblogs.com/zhanjun/p/3813996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!