在MVC中,Filter也是可以扩展的。在此,本人对Filter的理解就是AOP,不知道各位大侠,有什么高的见解,呵呵。。。

首先MVC四大过滤神器IAuthorizationFilter,IActionFilter,IResultFilter,IExceptionFilter。

在此之前,我们先安装Log4net日志神器:

看下项目的引用

配置文件

 1 <?xml version="1.0" encoding="utf-8"?>
2 <configuration>
3 <configSections>
4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
5 </configSections>
6 <log4net>
7 <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
8 <!--日志路径-->
9 <param name= "File" value= "D:\App_Log\"/>
10 <!--是否是向文件中追加日志-->
11 <param name= "AppendToFile" value= "true"/>
12 <!--log保留天数-->
13 <param name= "MaxSizeRollBackups" value= "10"/>
14 <!--日志文件名是否是固定不变的-->
15 <param name= "StaticLogFileName" value= "false"/>
16 <!--日志文件名格式为:2008-08-31.log-->
17 <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
18 <!--日志根据日期滚动-->
19 <param name= "RollingStyle" value= "Date"/>
20 <layout type="log4net.Layout.PatternLayout">
21 <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" />
22 </layout>
23 </appender>
24 <!-- 控制台前台显示日志 -->
25 <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
26 <mapping>
27 <level value="ERROR" />
28 <foreColor value="Red, HighIntensity" />
29 </mapping>
30 <mapping>
31 <level value="Info" />
32 <foreColor value="Green" />
33 </mapping>
34 <layout type="log4net.Layout.PatternLayout">
35 <conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" />
36 </layout>
37
38 <filter type="log4net.Filter.LevelRangeFilter">
39 <param name="LevelMin" value="Info" />
40 <param name="LevelMax" value="Fatal" />
41 </filter>
42 </appender>
43 <root>
44 <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
45 <level value="all" />
46 <appender-ref ref="ColoredConsoleAppender"/>
47 <appender-ref ref="RollingLogFileAppender"/>
48 </root>
49 </log4net>
50 <system.web>
51 <compilation debug="true" targetFramework="4.5.2" />
52 <httpRuntime targetFramework="4.5.2" />
53 </system.web>
54 </configuration>

增加LogHelper帮助类

 1  public class LogHelper
2 {
3 public static void WriteLog_Error(Type t, Exception ex)
4 {
5 log4net.ILog log = log4net.LogManager.GetLogger(t);
6 log.Error("Unhandled exception", ex);
7 }
8
9 public static void WriteLog_Error(Type t, string msg)
10 {
11 log4net.ILog log = log4net.LogManager.GetLogger(t);
12 log.Error(msg);
13 }
14
15 public static void WriteLog_Info(Type t, string msg)
16 {
17 log4net.ILog log = log4net.LogManager.GetLogger(t);
18 log.Info(msg);
19 }
20 }

还有一个重要的一步,在Gobal类中,要申明:

1 //加载配置文件
2 var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.config");
3 XmlConfigurator.ConfigureAndWatch(logCfg);

ok,到这里log4net,配置完成。

现在,我来扩展IExceptionFilter这个过滤器。

新建Log4NetExceptionFilter类,继承接口IExceptionFilter

1 public class Log4NetExceptionFilter : IExceptionFilter
2 {
3 public void OnException(ExceptionContext filterContext)
4 {
5 LogHelper.WriteLog_Error(GetType(), filterContext.Exception);
6 }
7 }

在FilterConfig中申明自己的异常处理:

1  public class FilterConfig
2 {
3 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
4 {
5 //filters.Add(new HandleErrorAttribute());
6 //加上自己的异常
7 filters.Add(new Log4NetExceptionFilter());
8 }
9 }

测试:在HomeController的GetXmlResult,手工增加异常:

 1  public XmlResult GetXmlResult()
2 {
3 int a = 1;
4 int b = 0;
5 int c = a / b;
6
7 StudentViewModel viewModel = new StudentViewModel();
8 viewModel.ID = "1";
9 viewModel.Name ="Zhangsan";
10 viewModel.Gender = "Man";
11
12 return new XmlResult(viewModel);
13 }

结果:

在介绍一下ActionFilterAttribute,这个特性有两个接口IActionFilter, IResultFilter。

因此,新建MyActionFilterAttribute,继承于ActionFilterAttribute

 1 public class MyActionFilterAttribute: ActionFilterAttribute
2 {
3 public override void OnActionExecuting(ActionExecutingContext filterContext)
4 {
5 LogHelper.WriteLog_Info(GetType(), "OnActionExecuting");
6 base.OnActionExecuting(filterContext);
7 }
8 public override void OnActionExecuted(ActionExecutedContext filterContext)
9 {
10 LogHelper.WriteLog_Info(GetType(), "OnActionExecuted");
11 base.OnActionExecuted(filterContext);
12 }
13
14 public override void OnResultExecuting(ResultExecutingContext filterContext)
15 {
16 LogHelper.WriteLog_Info(GetType(), "OnResultExecuting");
17 base.OnResultExecuting(filterContext);
18 }
19
20 public override void OnResultExecuted(ResultExecutedContext filterContext)
21 {
22 LogHelper.WriteLog_Info(GetType(), "OnResultExecuted");
23 base.OnResultExecuted(filterContext);
24 }
25 }

测试:在HomeController的GetXmlResult的方法上,增加MyActionFilterAttribute特性。ps:这里已经去掉刚刚手工增加的异常。

  [MyActionFilterAttribute]
public XmlResult GetXmlResult()
{
StudentViewModel viewModel = new StudentViewModel();
viewModel.ID = "1";
viewModel.Name ="Zhangsan";
viewModel.Gender = "Man";
return new XmlResult(viewModel);
}

结果:

出自http://www.cnblogs.com/xuliang1992/p/5328391.html

MVC学习系列——Filter扩展的更多相关文章

  1. MVC学习系列——ModelBinder扩展

    在MVC系统中,我们接受数据,运用的是ModelBinder 的技术. MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果. 那么是不是意味着能POS ...

  2. MVC学习系列——ActionResult扩展

    首先,MVC扩展性非常强. 我从ActionResult扩展入手,因为我们知道微软ActionResult和其子类,有时候并不能满足所有返回值. 比如:我需要返回XML. 因此,现在我扩展XMLRes ...

  3. MVC学习系列——RazorViewEngine扩展

    有时候,我们的项目涉及到多种风格,我们可以通过扩展RazorViewEngine,这样就可以保持后台代码不发生变化. 新建类ThemeViewEngine继承于RazorViewEngine publ ...

  4. MVC学习系列——HtmlHelper扩展

    微软自带很多HtmlHelper: ActionLink - 链接到操作方法.BeginForm  - 标记窗体的开头并链接到呈现该窗体的操作方法.CheckBox  - 呈现复选框.DropDown ...

  5. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

  6. ASP.NET MVC学习系列(二)-WebAPI请求

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

  7. ASP.NET MVC学习系列(二)-WebAPI请求(转)

    转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...

  8. MVC学习系列——记一次失败面试后,感想。

    在此写博客之际,热烈庆祝母校苏州科技学院,正式改名为苏州科技大学. 一晃眼,从自己投身IT行业已经两年有余,期间经历了结婚.买房等人生大事,非常感谢我的老婆,谢谢她这么爱我,嫁给我这个码农,呵呵... ...

  9. ASP.NET MVC学习笔记-----Filter

    ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...

随机推荐

  1. 剑指Offer面试题:24.复杂链表的复制

    一.题目:复杂链表的复制 题目:请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表.在复杂链表中,每个结点除了有一个Next指针指向下一 ...

  2. 小学徒成长系列—StringBuilder & StringBuffer关键源码解析

    在前面的博文<小学徒成长系列—String关键源码解析>和<小学徒进阶系列—JVM对String的处理>中,我们讲到了关于String的常用方法以及JVM对字符串常量Strin ...

  3. Dash文档制作教程

    前言 什么是Dash 面向程序员的文档库(Mac) 代码片段管理工具 这是强烈推荐给每天在各种API文档中摸爬滚打的程序员们的神器. 为什么要自己制作文档 官方的源中没有相关文档 文档在离线下体验更好 ...

  4. Javascript学习记录——原生JS实现旋转木马特效

    昨天学习到了JS特效部分,然后老师讲了旋转木马特效的实现,如上图.不过只是讲了通过点击箭头实现图片的切换,对于点击图片本身以及二者联动却是没有讲解. 本着一颗追求完美的心,今天花费了一个中午终于将整个 ...

  5. 【WP开发】加密篇:单向加密

    单向加密,简单地说就是对数据进行哈希处理,平时我们见得较多的有MD5.SHA1等,都属于单向加密.上一篇文章中,老周跟大家扯了有关双向加密的事,本文咱们就扯一下单向加密吧. 要对数据进行哈希处理也不是 ...

  6. 传智播客--数据绑定--INotifyPropertyChanged(小白内容)

    INotifyPropertyChanged一般在数据绑定的时候使用. InotifyPropertyChanged是.net内置的接口,数据绑定时会检测DataContext是否实现了Inotify ...

  7. 纯CSS照片墙

    css中transform参考CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate 效果图:

  8. 应用程序框架实战十五:DDD分层架构之领域实体(验证篇)

    在应用程序框架实战十四:DDD分层架构之领域实体(基础篇)一文中,我介绍了领域实体的基础,包括标识.相等性比较.输出实体状态等.本文将介绍领域实体的一个核心内容——验证,它是应用程序健壮性的基石.为了 ...

  9. 如何用Perl对Excel的数据进行提取并分析

    巡检类工作经常会出具日报,最近在原有日报的基础上又新增了一个表的数据量统计日报,主要是针对数据库中使用较频繁,数据量又较大的31张表.该日报有两个sheet组成,第一个sheet是数据填写,第二个sh ...

  10. php这是一个随机打印输出字符串的例子

    <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); define(& ...