回到目录

MVC的过滤器相信大家都用过,一般用来作权限控制,因为它可以监视你的Action从进入到最后View的渲染,整个过程ActionFilter这个过滤器都参与了,而这给我们的开发带来了更多的好处,如你可以在进行页面上进行权限的判断,在页面渲染前修改页面的内容,而第二个功能,就是我们今天要说的。

解决实际问题

今天出现一个问题,在webapi向手机端返回数据时,手机端不能正常解析全角的标点符号,英半角英文符号是可以正确解析的,这时我有了一个想法,就是在页面输出之前,对它进行处理,将全角符号替换成半角的,而这个功能你不可能写在每个Action里,这对任何人来说都是一件悲惨的事,所以,ActionFilter出来了,让它自动去监视,帮我们解决问题吧!

先看一下全局过滤器的配置

    /// <summary>
/// 全局过滤器的配置
/// </summary>
public class FilterConfig
{
/// <summary>
/// 注册全局的过滤器
/// </summary>
/// <param name="filters"></param>
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute()); //响应流处理程序
Func<string, string> aa = (str) =>
{
return str.Replace("(", "[").Replace(")", "]");
};
//添加响应流过滤器
filters.Add(new ResponseFilter(aa)); }
}

下面是ResponseFilter的代码,主要实现了对响应流的重写,注意,你必须在页面渲染前进行处理,当页面渲染后,你无法对响应流修改,因为这时的流是只读流

我的ResponseFilter提供了一个Func的委托,就是让开发人员都自己的处理策略进行自定义,这样有效的提高了代码的重复利用性,如果把处理逻辑写在过滤器里,那么你的这个响应过滤器就被写死了,无法扩展和复用

 /// <summary>
/// Http响应流过滤器,对它进行加工
/// </summary>
public class ResponseFilter : ActionFilterAttribute
{
/// <summary>
/// 输出流处理程序
/// </summary>
Func<string, string> _process; #region Contructors
public ResponseFilter()
: this(null)
{ }
public ResponseFilter(Func<string, string> process)
{
this._process = process;
}
#endregion #region Override Methods
/// <summary>
/// action执行前
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
}
/// <summary>
/// view页面渲染前
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
}
/// <summary>
/// view页面渲染后
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
}
/// <summary>
/// action执行后
/// 在这里修改输出流
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{ if (filterContext.Result.GetType() == typeof(JsonResult))
{
var aa = ((System.Web.Mvc.JsonResult)(filterContext.Result)).Data;
JavaScriptSerializer jss = new JavaScriptSerializer();
var str = jss.Serialize(aa);
if (this._process != null)
{
//处理输出流
str = this._process(str);
((System.Web.Mvc.JsonResult)(filterContext.Result)).Data = jss.Deserialize<object>(str);
} } if (filterContext.Result.GetType() == typeof(ContentResult))
{
((System.Web.Mvc.ContentResult)(filterContext.Result)).Content += "大叔";
} base.OnActionExecuted(filterContext);
}
#endregion }

感谢您的阅读,也感谢对仓储大叔的支持!

回到目录

爱上MVC系列~过滤器实现对响应流的处理的更多相关文章

  1. WebApi系列~对HttpClient的响应流进行解压

    回到目录 有时我们的请求头为ContentEncoding添加了gzip进行了压缩,而服务端返回数据时也会对它进行gzip压缩,如果在这种情况下,你直接头响应流会是乱码,而必须先进行压缩,大叔将这块的 ...

  2. 爱上MVC系列~带扩展名的路由失效问题

    回到目录 对MVC中,对URL进行重写变得非常方便,你只要设置相应的路由规则即可完成,但进行MVC3后,发现设置了以下路由,系统具体不认 routes.MapRoute( name: "De ...

  3. 爱上MVC系列~前端验证与后端数据有效性验证

    回到目录 有一句话,在10年前就是真理,到现在也一直都是,“前端验证可以没有,但后端验证必须要有”,这句话相信大家都没有意见吧,前端验证一般指通过JS方式实现的,友好的,个性的验证方式,而后端验证是指 ...

  4. 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)

    过滤器 什么是过滤器? 过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理. 在ASP.NET MVC的请求处理中一种有19个管道事件分别是 BeginRequ ...

  5. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  6. MVC系列1-MVC基础 (ASP.NET)

    终于决定写一个系列的文章了,最开始其实是准备写一下WPF的,因为我这两年一直在做WPF,对WPF的喜爱自然是无以言表.但是由于我所在的地区对WPF的普及不是很广泛,所以,被迫又开始做起来web,但是我 ...

  7. MVC系列1-MVC基础

    终于决定写一个系列的文章了,最开始其实是准备写一下WPF的,因为我这两年一直在做WPF,对WPF的喜爱自然是无以言表.但是由于我所在的地区对WPF的普及不是很广泛,所以,被迫又开始做起来web,但是我 ...

  8. 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  9. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

随机推荐

  1. Field 'id' doesn't have a default value(jdbc连接错误)

    JDBC 连接错误: 编写数据库连接增添数据时,出现以下错误: error : java.sql.SQLException: Field 'id' doesn't have a default val ...

  2. 使用WindowsPE破解管理员密码

    使用WindowsPE破解管理员密码 1将操作系统关闭,编辑虚拟机设置,先用老毛桃生成一个ISO,点.iso制作,再点生成ISO文件,然后选择WinPE的ISO镜像存放的位置 将WinPE.ISO文件 ...

  3. 【CronExpression表达式详解和案例】

    1. cron表达式格式: {秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)} 2. cron表达式各占位符解释: {秒数} ==> 允许值范围: 0~59 ,不允许 ...

  4. SQL Server 查出未提交事务(长事务)SQL

    ),value )); INSERT INTO @tab EXEC('DBCC OPENTRAN WITH TABLERESULTS'); SELECT name,CAST(value AS DATE ...

  5. 快手4.0 (KSCAD)

    快手 4.0 (KSCAD) 是一款简单易用的矢量绘图软件,其功能和Visio类似,可以绘制工艺流程图,流程图.组织结构图.网络拓扑图.思维导图.商业图表等. 经过二次开发,可以应用于各种领域的图形化 ...

  6. 【开发环境】JAVA 环境变量批处理

    @echo off set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmen ...

  7. node的事件模块应用(译)

    第一次接触Node.js时,就觉得他只不过是用javascript实现的服务端.但实际上他提供了许多浏览器端不具备的方法,比如EventEmitter类.我们在本文中来学习如何使用EventEmitt ...

  8. new的原罪

    一直以为在开发阶段能够直接调用的,速度而言一定是最优秀的,因为总比后期通过反射之类来调用来得快吧. 下面请看一个SB的例子,重新编译以后,这个类在创建100,000,000实体时居然耗费了16秒的时间 ...

  9. MongoDB学习笔记—03 增删改查操作

    MongoDB的CURD操作分别通过函数insert().update().find().remove()进行 MongoDB文档新增与删除 MongoDB中关于文档的新增与删除比较简单.主要通过in ...

  10. android目录介绍