回到目录

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. 前台js与后台方法互调

    一:后台调用前台js的方法 ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", " ...

  2. SQLServer : 几个特殊函数(RAND,CHECKSUM, NEWID)

    这一篇我们来捋捋在T-SQL中可能会用到的几个特殊的函数 1. 随机数: RAND 返回从 0 到 1 之间的随机 float 值. 语法: RAND ( [ seed ] ) seed 提供种子值的 ...

  3. Block循环引用问题研究

    自从苹果在objc中添加Block功能支持以后已经过了很久.目前网上对于Block的使用有很多介绍.不过对于Block的内存管理问题,则是众说纷纭.再加上objc开始使用ARC以后,对于Block的内 ...

  4. Spring学习笔记 5. 尚硅谷_佟刚_Spring_自动装配

    1,回顾以前的做法 一个人有姓名,有住址,有一辆车.其中住址和车也是一个类,这种情况下不用自动装配是十分容易实现的 (1)Person类 package com.zsq; public class P ...

  5. zabbix利用mutt和msmtp配置邮件报警

    Mutt安装 yum –y install mutt msmtp安装 yum –y install openssl openssl-devel libntlm libntlm-devel cyrus- ...

  6. 图层的核心动画(CABaseAnimation)续

    Main.storyboard ViewController.m // //  ViewController.m //  8A01.核心动画 // //  Created by huan on 16/ ...

  7. ServiceMix in daemon mode

    For development simplicity, we can start Karaf in daemon mode by executing 'bin\admin.bat start root ...

  8. 【整理】--C++三种参数传递方式

    在C++中,共有三种参数传递方式: 按值传递(pass by value) 地址传递(pass by pointer) 引用传递(pass by reference) (1)按值传递的过程为:首先计算 ...

  9. poj 1099

    http://poj.org/problem?id=1099 #include<stdio.h> #include<string.h> #include <iostrea ...

  10. android 启动过程

    android系统启动的时候首先会启动Linux的基础进程,加载Linux kernel启动初始化(init)进程. 接着,回启动Linux deamon(守护进程)会启动以下的内容: ①启动USBd ...