首页 > 代码库 > MVC4 过滤器使用和怎样控制全部action和部分action

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

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

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

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

  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种方式实现:

第一种:代码修改如下:

 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

第二种:代码修改如下:

 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。