部分博客是预先定义的有关特性的一些基本特征,同时还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校验用的事实上也是特性的相关实现。许多关于我们需要进一步探讨的特性等知识。
版权声明:本文博客原创文章,博客,未经同意,不得转载。