且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-08-30 22:45:42

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

一、filter简单介绍

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

 

MVC中的filter类型:

Attribute(两)——定义自己的特色+Asp.net 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/>");

        }

运行上述代码结果:

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

三、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校验用的事实上也是特性的相关实现。许多关于我们需要进一步探讨的特性等知识。


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








本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4733573.html,如需转载请自行联系原作者