Attribute自定义特性+Asp.net MVC中的filter详解
转载自: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详解的更多相关文章
- ASP.NET MVC教程二:ASP.NET MVC应用程序结构详解
在上一篇文章中,讲解了一些MVC的概念,并且创建了第一个ASP.NET MVC项目,这篇文章将讲解ASP.NET MVC程序中的代码解构,新创建的MVC应用程序解构如下图所示: 一.App_Data ...
- ASP.NET MVC Controller激活系统详解1
一.引言 好久没有写博客了,前一段时间学习了Controller激活的一篇很好的博文(链接),在此做个学习总结. 二.Controller 2.1 IController Controller类型直接 ...
- MVC中的HtmlHelper详解
熟悉MVC开发的朋友都应该知道在MVC中,每一个Controller都对应一个View,并且CS文件和对应的ASPX文件也被分离了,更重要的是不再有服务器端控件在工具箱中,不再是代码后至了.MVC中的 ...
- ASP.NET MVC Controller激活系统详解2
一.引言 此篇博文紧接上篇博文进行阐述,本篇博文阐述的主题是Controller激活和url路由 二.总述 ASP.NET路由系统是HTTP请求抵达服务端的第一道屏障,它根据注册的路由规则对拦截的请求 ...
- asp.net mvc global.asax文件详解
一.文件概述 global.asax这个文件包含全局应用程序事件的事件处理程序.它响应应用程序级别和会话级别事件的代码. 运行时, Global.asax 将被编译成一个动态生成的 .NET Fram ...
- django中的filter详解
filter (数据过滤) 我们很少会一次性从数据库中取出所有的数据:通常都只针对一部分数据进行操作. 在Django API中,我们可以使用`` filter()`` 方法对数据进行过滤: > ...
- asp.net mvc 中的自定义验证(Custom Validation Attribute)
前言
- 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 ...
- Asp.net Mvc中利用ValidationAttribute实现xss过滤
在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...
随机推荐
- CISCO实验记录七:OSPF
一.要求 1.使用OSPF创建路由表 2.查看OSPF邻居 二.实现 1.使用OSPF创建路由表 #router ospf 1 #network 192.168.1.0 0.0.0.255 area ...
- java课后实验性问题2
课后作业一:计算组合数 程序设计思想: 从键盘获取组合数,判断是否构成组合数.分别用三种方法计算组合数输出. 程序流程图: import java.util.Scanner; public class ...
- Npoi Web 项目中(XSSFWorkbook) 导出出现无法访问已关闭的流
NPOI生产.xlsx文件件时,在使用book.Write(ms);后,会关闭流,这样导致再次使用Respons输出流的时候就出错了. 造成关闭流的主要原因有时其实是跨域,同域是没有问题的. //新建 ...
- 【思考】为什么说Bagging减少variance,Boosting减少bias?(转载)
具体讨论可见于此知乎问题,有很多种理解方向,甚至这一个命题可能本来就不成立!
- List的remove方法里的坑
今天遇到一件怪事,用一个ArrayList添加了一个对象,再调用ArrayList的remove方法删除该对象,当然这时对象是数据库里查出来的,但内容绝对是一样,却发现remove失败了.演示一下,这 ...
- 请求路径@PathVariable注释中有点.英文句号的问题(忽略英文句号后面的后缀)
前端页面请求地址 <video id=example-video width=960 height=540 class="video-js vjs-default-skin" ...
- windows 下OPENSSL 生成秘钥和公钥的方法
1. 生成原始 RSA私钥文件 private_key.pem openssl genrsa -out private_key.pem 1024 2. 将原始 RSA私钥转换为 pkcs8格式 ope ...
- XGBoost原理详解
原文:https://blog.csdn.net/qq_22238533/article/details/79477547
- vue项目中使用v-for的方法莫名提示错误
错误示例: 解决方法一: 在v-for后面绑定key,示例如下→ 解决方法二: 点击左下角“设置”>“用户设置”内添加一下代码片段: { "vetur.validation.templ ...
- [Python[Anaconda & PyTorch]] -- 使用conda 安装 Torch 出现错误 --Windows
... (⊙o⊙)… ... 当时具体的错误我没有截图, 用这个命令时 , conda 会报无法在源中找到PyTorch, 还是什么的错误 有很大的一个可能是, 安装的Anaconda 是32 位的, ...