• Attribute(两)——定义自己的特色+Asp.net MVC中间filter详细解释


    部分博客是预先定义的有关特性的一些基本特征,同时还Attribute这一概念的一个宏观上的认识,在上篇博客结尾介绍了有关为自己定义特性服务的AttributeUsage,这篇博客主要是通过filter的使用间接的了解自己定义特性的详细应用。

    一、filter简单介绍

             在了解自己定义特性前,先引入一个概念filter。它是MVC中自带的一种功能,在我们项目中一般会遇到在Action运行前或结束时。去运行日志记录或错误处理等功能。通常可使用AOP截取来实现。可是在MVC中提供了filter过滤,大慷慨便了开发者。

     

    MVC中的filter类型:


    二、应用

    声明一个自己定义特性。继承自ActionFilterAttribute

    详细代码:

    	//[AttributeUsage (AttributeTargets.All ,AllowMultiple =true)]//allmultiple容很多个标签同一时候起作用
    	    public class MyActionfilter:ActionFilterAttribute 
    	    {
    	       public  string Name { set; get; }
    	     
    	        //action运行之前先运行此方法
    	        public override void OnActionExecuting(ActionExecutingContext filterContext)
    	        {
    	            base.OnActionExecuting(filterContext);
    	            HttpContext.Current.Response.Write("<br />OnOnActionExecuting:" + Name);
    	        }
    	
    			 //action运行之后先运行此方法
    	        public override void OnActionExecuted(ActionExecutedContext filterContext)
    	        {
    	            base.OnActionExecuted(filterContext);
    	            HttpContext.Current.Response.Write("<br />onActionExecuted:" + Name);
    	        }
    	        //actionresult运行之前运行此方法
    	        public override void OnResultExecuting(ResultExecutingContext filterContext)
    	        {
    	            base.OnResultExecuting(filterContext);
    	            HttpContext.Current.Response.Write("<br />OnResultExecuting:" + Name);
    	
    	        }
    	
    			 //actionresult运行之后运行此方法
    	        public override void OnResultExecuted(ResultExecutedContext filterContext)
    	        {
    	            base.OnResultExecuted(filterContext);
    	            HttpContext.Current.Response.Write("<br />OnResultExecuted:" + Name);
    	
    	        }
    	    }
    

    Controller:

     [MyActionfilter(Name="IndexAction")]

            public ActionResult Index()

            {

               Response.Write("<p>action被运行完了</p>");

                return Content("<br/>ok:视图被渲染了!<br/>");

            }

    运行上述代码结果:


    三、filter优先级别

    如上所述。controller中的仅仅有Index方法中有自己定义特性。假设想让全部的Action在运行时,都进行过滤,那么我们能够在Controller上加入自己定义filter特性标签,这样运行它的范围就是整个Controller

     

    而假设我们想要在全部的Controller中的全部Action中均运行此方法呢?我们能够在App_Start中的filterConfig中对自己定义的过滤器进行注冊

    Filters.Add(newMyActionFilterAttribute(){Name="Global"});//全局过滤

     

     

    那么这种话就产生了优先级问题,离自己近期的优先级别最高,方法级别>Controller级别>全局级别

     

    那么假设我想让全部级别的方法均生效,就是每一个级别的特性方法都去运行一遍,那么又该如何呢?这里就用到了AttributeUsage这个类了

    将上面注掉的解开

    //[AttributeUsage (AttributeTargets.All ,AllowMultiple =true)]//allmultiple容很多个标签同一时候起作用

    AllowMultiple这个属性的值设为true。此时便会运行全部声明的特性方法了。

     

    总结:通过以上对filter的使用。应该对自己定义特性有了一个初步的了解,同一时候在项目中UI中用到的自己定义特性,通过反射来解析。同一时候在处理异常时,我们能够利用异常特性HandleErrorAttribute来对程序中出现的异常进行处理。微软默认在全局过滤器中加上了处理异常过滤,可是我们也能够加上自己的异常过滤。再者,MVC中自带的前端UI校验用的事实上也是特性的相关实现。许多关于我们需要进一步探讨的特性等知识。


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 快速幂
    Java实现 蓝桥杯VIP 算法提高 最长字符序列
    Java实现 蓝桥杯VIP 算法提高 最长字符序列
    Java实现 蓝桥杯VIP 算法提高 最长字符序列
    Java实现 蓝桥杯VIP 算法提高 最长字符序列
    Java实现 蓝桥杯VIP 算法提高 最长字符序列
    linux下配置QT(很全的步骤,从下载开始,配置QMAKESPEC)
    QT 读取文件夹下所有文件(超级简单的方法,不需要QDirIterator)
    Windows平台下的图形化的Ping工具
    Qt中的键盘事件,以及焦点的设置(比较详细)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4733573.html
Copyright © 2020-2023  润新知