zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Thymeleaf模板引擎语法
    kali更新软件源
    解决kali安装成功后没有声音的问题
    SSO的误区及建议
    关于 target="_blank"漏洞的分析
    好久没来了,平时一些笔记都记在印象笔记,长传一波
    BIOS基础
    CSRF的本质及防御
    linux下stricky
    CSRF与xss的区别
  • 原文地址:https://www.cnblogs.com/zhanjun/p/3813996.html
Copyright © 2011-2022 走看看