mvc filter

//C# - 我怎么能拦截HTML的一个ViewResult,修改它,并为它呢? -  http://www.16kan.com/question/detail/301423.html




//http://dinowang.blogspot.tw/2013/07/documentwrite-aspnet-mvc-viewresult.html
//跨網站利用 document.write 顯示 ASP.NET MVC ViewResult 內容, 使用 ActionFilter


//http://www.cnblogs.com/niuchenglei/archive/2010/08/15/1800179.html
//http://www.nsoff.com/post/2012/03/13/Controller%E8%8E%B7%E5%BE%97View%E5%86%85%E5%AE%B9%E8%A7%A3%E6%9E%90%E5%90%8E%E8%BE%93%E5%87%BA.aspx
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.IO;


namespace NSOFF.Core.Mvc {
    public static class ControllerExtensions {
        #region Render Partial to String
        public static string RenderPartialViewToString(this Controller controller) {
            return RenderPartialViewToString(null, null);
        }
 
        public static string RenderPartialViewToString(this Controller controller, string viewName) {
            return RenderPartialViewToString(controller, viewName, null);
        }
 
        public static string RenderPartialViewToString(this Controller controller, object model) {
            return RenderPartialViewToString(controller, null, model);
        }
 
        public static string RenderPartialViewToString(this Controller controller, string viewName, object model) {
            if (string.IsNullOrEmpty(viewName))
                viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
 
            controller.ViewData.Model = model;
 
            using (StringWriter sw = new StringWriter()) {
                ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
                ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);
 
                return sw.GetStringBuilder().ToString();
            }
        }
        #endregion
 
        #region Render View to String
        public static string RenderViewToString(this Controller controller) {
            return RenderViewToString(controller, null);
        }
 
        public static string RenderViewToString(this Controller controller, string viewName) {
            return RenderViewToString(controller, viewName, null);
        }
 
        public static string RenderViewToString(this Controller controller, object model) {
            return RenderViewToString(controller, null, model);
        }
 
        public static string RenderViewToString(this Controller controller, string viewName, object model) {
            return RenderViewToString(controller, viewName, model, string.Empty);
        }
 
        public static string RenderViewToString(this Controller controller, string viewName, object model, string masterName) {
            if (string.IsNullOrEmpty(viewName))
                viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
 
            controller.ViewData.Model = model;
 
            using (StringWriter sw = new StringWriter()) {
                ViewEngineResult viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, masterName);
                ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);
 
                return sw.GetStringBuilder().ToString();
            }
        }
        #endregion
    }

}







using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Text;
using System.Web.Mvc;
using System.Text.RegularExpressions;


namespace ShippingRen.ServiceHosts.MVC.ActionFilter
{
    public class WhiteSpaceFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var request = filterContext.HttpContext.Request;
            var response = filterContext.HttpContext.Response;
            response.Filter = new WhiteSpaceFilter(response.Filter, s =>
            {
                s = Regex.Replace(s, @"\s+(?=<)|\s+$|(?<=>)\s+", "");


                //single-line doctype must be preserved
                var firstEndBracketPosition = s.IndexOf(">");
                if (firstEndBracketPosition >= 0)
                {
                    s = s.Remove(firstEndBracketPosition, 1);
                    s = s.Insert(firstEndBracketPosition, ">");
                }
                return s;
            });
        }
    }


    public class WhiteSpaceFilter : Stream
    {
        private Stream _shrink;
        private Func<string, string> _filter;


        public WhiteSpaceFilter(Stream shrink, Func<string, string> filter)
        {
            _shrink = shrink;
            _filter = filter;
        }


        public override bool CanRead { get { return true; } }
        public override bool CanSeek { get { return true; } }
        public override bool CanWrite { get { return true; } }
        public override void Flush() { _shrink.Flush(); }
        public override long Length { get { return 0; } }
        public override long Position { get; set; }
        public override int Read(byte[] buffer, int offset, int count)
        {
            return _shrink.Read(buffer, offset, count);
        }
        public override long Seek(long offset, SeekOrigin origin)
        {
            return _shrink.Seek(offset, origin);
        }
        public override void SetLength(long value)
        {
            _shrink.SetLength(value);
        }
        public override void Close()
        {
            _shrink.Close();
        }


        public override void Write(byte[] buffer, int offset, int count)
        {
            // capture the data and convert to string
            byte[] data = new byte[count];
            Buffer.BlockCopy(buffer, offset, data, 0, count);
            string s = Encoding.UTF8.GetString(buffer);


            // filter the string
            s = _filter(s);


            // write the data to stream
            byte[] outdata = Encoding.UTF8.GetBytes(s);
            _shrink.Write(outdata, 0, outdata.GetLength(0));
        }
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值