Attribute(二)——自定义特性+Asp.net MVC中的filter详解

上篇博客是关于特性中有关预定义特性的一些基础,同时也是对Attribute这一概念的一个宏观上的认识,在上篇博客结尾介绍了有关为自定义特性服务的AttributeUsage,这篇博客主要是通过filter的使用间接的了解自定义特性的具体应用。

一、filter简介

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

 

MVC中的filter类型:

Attribute(二)——自定义特性+Asp.net MVC中的filter详解_第1张图片

二、应用

声明一个自定义特性,继承自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("
OnOnActionExecuting:" + Name); } //action执行之后先执行此方法 public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); HttpContext.Current.Response.Write("
onActionExecuted:" + Name); } //actionresult执行之前执行此方法 public override void OnResultExecuting(ResultExecutingContext filterContext) { base.OnResultExecuting(filterContext); HttpContext.Current.Response.Write("
OnResultExecuting:" + Name); } //actionresult执行之后执行此方法 public override void OnResultExecuted(ResultExecutedContext filterContext) { base.OnResultExecuted(filterContext); HttpContext.Current.Response.Write("
OnResultExecuted:" + Name); } }

Controller:

 [MyActionfilter(Name="IndexAction")]

        public ActionResult Index()

        {

           Response.Write("

action被执行完了

");

            return Content("
ok:视图被渲染了!
");

        }

执行上述代码结果:

Attribute(二)——自定义特性+Asp.net MVC中的filter详解_第2张图片

三、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校验用的其实也是特性的相关实现。更多关于特性的知识有待我们进一步探索。


你可能感兴趣的:(.NET)