转载自:http://blog.csdn.net/wangyy130/article/details/44241957

一、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); }
}

  使用

[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这个类了

将 MyActionfilter 上面注掉的解开

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

让AllowMultiple这个属性的值设为true,此时便会执行所有声明的特性方法了。

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

另外用得多的Filter可能就是ExceptionFilter了  比如发生异常写日志啊啥的

MVC会自己实现一个HandleErrorAttribute 并且在 FilterConfig.cs 设置为全局的,所以如果自己需要自定义一个ExceptionFilter可以继承 HandleErrorAttribute 然后重写其中的 OnException

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]//allmultiple容许多个标签同时起作用
public class MyExceptionFilter : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{ base.OnException(filterContext);
HttpContext.Current.Response.Redirect("http://www.baidu.com");
//HttpContext.Current.Response.Write("<br />发生异常,可以写日志了");
}
}

  

Attribute自定义特性+Asp.net MVC中的filter详解的更多相关文章

  1. ASP.NET MVC教程二:ASP.NET MVC应用程序结构详解

    在上一篇文章中,讲解了一些MVC的概念,并且创建了第一个ASP.NET MVC项目,这篇文章将讲解ASP.NET MVC程序中的代码解构,新创建的MVC应用程序解构如下图所示: 一.App_Data ...

  2. ASP.NET MVC Controller激活系统详解1

    一.引言 好久没有写博客了,前一段时间学习了Controller激活的一篇很好的博文(链接),在此做个学习总结. 二.Controller 2.1 IController Controller类型直接 ...

  3. MVC中的HtmlHelper详解

    熟悉MVC开发的朋友都应该知道在MVC中,每一个Controller都对应一个View,并且CS文件和对应的ASPX文件也被分离了,更重要的是不再有服务器端控件在工具箱中,不再是代码后至了.MVC中的 ...

  4. ASP.NET MVC Controller激活系统详解2

    一.引言 此篇博文紧接上篇博文进行阐述,本篇博文阐述的主题是Controller激活和url路由 二.总述 ASP.NET路由系统是HTTP请求抵达服务端的第一道屏障,它根据注册的路由规则对拦截的请求 ...

  5. asp.net mvc global.asax文件详解

    一.文件概述 global.asax这个文件包含全局应用程序事件的事件处理程序.它响应应用程序级别和会话级别事件的代码. 运行时, Global.asax 将被编译成一个动态生成的 .NET Fram ...

  6. django中的filter详解

    filter (数据过滤) 我们很少会一次性从数据库中取出所有的数据:通常都只针对一部分数据进行操作. 在Django API中,我们可以使用`` filter()`` 方法对数据进行过滤: > ...

  7. asp.net mvc 中的自定义验证(Custom Validation Attribute)

    前言

  8. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  9. Asp.net Mvc中利用ValidationAttribute实现xss过滤

    在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...

随机推荐

  1. 笔记四(Competitor Analysis Test小结)

    1.关机后启动电脑,测试BIOS的POST time 2.进入睡眠模式后,按任意键,通过Windows logs查看bios的init时间 3.进入BIOS setup的快捷键,一般为F2 4.进入B ...

  2. mybatis参数形式

    1 使用map <select id="selectRole" parameterType="map" resultType="RoleMap& ...

  3. git 新建仓库第一次提交

    1 . git init //初始化仓库,在初始化的目录中会出现.git的文件夹 2. git add .(文件name) //添加文件到本地仓   3. git commit -m "fi ...

  4. 转载:OutOfMemoryError系列(2): GC overhead limit exceeded

    这是本系列的第二篇文章, 相关文章列表: OutOfMemoryError系列(1): Java heap space OutOfMemoryError系列(2): GC overhead limit ...

  5. [java]取当前时间

    /** * Get current date time * * @return */ private static String getCurrTime() { SimpleDateFormat sd ...

  6. c++ Container print

    template<typename Container>void PrintContents(const Container& con) { Container::const_it ...

  7. scikit-learn机器学习(四)使用决策树做分类,并画出决策树,随机森林对比

    数据来自 UCI 数据集 匹马印第安人糖尿病数据集 载入数据 # -*- coding: utf-8 -*- import pandas as pd import matplotlib matplot ...

  8. 三小时攻克 Kubernetes!

    我保证本文是最详尽的 Kubernetes 技术文档,从我在后台排版了这么漫长的时间就能看出来.废话不多说——牢牢占据容器技术统治地位的 Kubernetes,其重要性想必不言而喻. 以下为译文: 为 ...

  9. vue-cli3项目运行时一直发http://localhost:8080/sockjs-node/info?t=1462183700002请求

    报错如下图: 解决方式: 一.如果是在开发环境,应该是开发的时候网络环境变更导致,比如你切换无线网络,导致开发服务器的IP地址换了,这样开发服务器会不知道如何确定访问源.开发环境中关闭npm dev ...

  10. 深入浅出的分析 Set集合

    01. 摘要 Set集合的特点主要有:元素不重复.存储无序的特点. 打开 Set 集合,主要实现类有 HashSet.LinkedHashSet .TreeSet .EnumSet( RegularE ...