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();
            }
        }
    }

这样每个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)
        {
            //
        }
    }

第二种:代码修改如下:

 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)
        {
            //
        }
    }

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

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

[NoFilter(Order=2)]

[LoginFilter(Order=1)]

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

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

时间: 2024-08-09 06:19:58

MVC4 过滤器使用和怎样控制全部action和部分action的相关文章

Asp.Net MVC 权限控制(三):Controller和Action级别控制

续接上篇:Asp.Net MVC 权限控制(二):Controller级别控制 再次在重构!这次对Controller和Action进行验证. 思路:系统有很多功能集,功能集对应很多Controller和Action,角色分配很多功能集. 首先构建一个基础数据: 1.功能集初始化: /// <summary> /// 系统模块 /// </summary> public class SystemModule { public SystemModule() { this.ID = G

EF5+MVC4系列(11)在主视图中用Html.RenderPartial来调用分部视图(ViewDate传值);在主视图中用ajax调用action并在action中return PartialView返回分部视图(return view 和return PartialView 的区别)

一:主视图中调用子视图 在没有使用母版页的主视图中(也就是设置了layout为null的视图中),使用 Html.RenderPartial  可以调用分部视图(只调用视图,不调用action),并且使用 ViewData 来从主Action里面传值到主视图,或者是分布视图 最后生成的html如下   二:在主视图中用ajax调用子action并在子action中使用return PartialView返回分布视图(return view 和return PartialView 的区别) 这种情

struts2中&lt;welcome-file&gt;index.action&lt;/welcome-file&gt;直接设置action,404的解决方案

这几天的项目页面的访问全部改为.action访问,在修改首页时遇到了问题.将web.xml文件中<welcome-file>index.action</welcome-file>修改成这样,访问首页时报404错误,也就是说文件找不到.上网查了有两种解决方法.     方法一.在WebRoot下新建一个index.action空文件,这个方法简单实用,强烈推荐.    方法二.因为 welcome-file 必须是实际存在的文件,不能是action或者servlet路径你可以设置一个

phpcms v9中 action=&quot;position&quot; 和action=&quot;lists&quot;有什么区别, 以及action 的属性和值

action值的含义: lists 内容数据(文章?)列表 relation 内容相关文章 hits 内容数据点击排行榜 category 内容栏目列表 position 内容推荐位列表 phpcms v9中 action="position" 和action="lists"有什么区别, 以及action 的属性和值,布布扣,bubuko.com

【SSH三大框架】Struts2基础第三篇:配置Action以及调用Action的三种方式

一.struts.xml中的包和命名空间 1.Struts2不支持为单独的Action设置命名空间,而是通过为包指定namespace属性来为包下面的所有Action指定共同的命名空间. 如果在配置<package>的时候没有指定namespace属性,则该包下的所有Action处于默认的包空间下 2.例如: <package name="lee" extends="struts-default"> <action name="

There is no Action mapped for action name mylogin!regist错误原因

声明:本博客为原创博客,未经允许,不得转载!小伙伴们如果是在别的地方看到的话,建议还是来csdn上看吧(原文链接地址为http://blog.csdn.net/bettarwang/article/details/39650937),毕竟在csdn上看代码和提问.讨论都更方便. 大家都知道,可以利用DMI(Dynamic Method Invocation,动态方法调用)进行一个Action对应多个表单动作,今晚尝试了登录与注册两个表单动作的示例时,却总是弹出"There is no Actio

Struts2异常:HTTP Status 404 - There is no Action mapped for action name addBook.

HTTP Status 404 - There is no Action mapped for action name addBook. 在地址栏进行访问的时候,出现了这个错误信息,导致出现此异常的原因可能有如下的三个原因: 1. 可能是struts.xml文件的名称或者位置写错. 2. 可能是struts.xml文件的内容错误. 3. 可能是因为struts.xml文件按照分模块的方式进行编辑,没有将模块下的xml文件引入到struts的核心配置文件struts.xml中(我的异常因为这个原因

struct2的structs.xml文件配置There is no Action mapped for action name 问题

很久没写过博客,今天重新开始写,新技术太多,只有通过博客才可以不断积累,本人水平有限,如有错误,欢迎指正,谢谢 今天在MAVEN上配置web project的struct2,发现自己忽略了很多问题,再次记录一下,希望可以帮助遇到相同或相似问题的同学,本人已经是第二次遇到这种问题,就是没有记录下来,时间久了,遇到了也忘记怎么解决了,在此吐槽一下自己哈.There is no Action mapped for action name 问题就是找不到相应的action,问题的出现主要原因有一下几个:

Android学习路线(八)为Action bar添加action按钮

Action bar允许你为与当前应用上下文相关的最重要的action items添加action按钮.那些直接显示在action bar上的icon或者文字都被称作action buttons.那些不适合action bar或者不是那么重要的Actions将会被隐藏在action overflow(译者注:action bar最右侧的垂直的三个点)里. 图1. 一个包含Search功能的action button和用来展示附加action的action overflow. 在XML文件中指定A