//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));
}
}
}