查看源码可以替换Response.Output来获取asp.net mvc view渲染后的页面字符串,如下:
using System;
using System.Globalization;
using System.IO;
using System.Web;
using System.Web.Mvc;
namespace xxxx
{
public static class WebMvcHelper
{
public static string Render(this Controller controller, string viewName, object model = null, bool partial = false)
{
return Render(controller.ControllerContext, viewName, model, partial);
}
public static string Render(this Controller controller, ViewResultBase viewResult)
{
return Render(controller.ControllerContext, viewResult);
}
public static string Render(this ControllerContext context, string viewName, object model = null, bool partial = false)
{
if (context == null) throw new ArgumentNullException("context");
var controller = context.Controller;
if (model != null) controller.ViewData.Model = model;
ViewResultBase viewResult;
if (partial) viewResult = new PartialViewResult();
else viewResult = new ViewResult { MasterName = null };
viewResult.ViewData = controller.ViewData;
viewResult.TempData = controller.TempData;
viewResult.ViewName = viewName;
return Render(context, viewResult);
}
public static string Render(this ControllerContext context, ViewResultBase viewResult)
{
if (context == null) throw new ArgumentNullException("context");
if (string.IsNullOrEmpty(viewResult.ViewName)) viewResult.ViewName = context.RouteData.GetRequiredString("action");
ViewEngineResult viewEngineResult = null;
if (viewResult.View == null)
{
viewEngineResult = (viewResult is PartialViewResult) ?
ViewEngines.Engines.FindPartialView(context, viewResult.ViewName) :
ViewEngines.Engines.FindView(context, viewResult.ViewName, (viewResult as ViewResult).MasterName);
viewResult.View = viewEngineResult.View;
}
try
{
var output = new StringWriter(CultureInfo.InvariantCulture);
var viewContext = new ViewContext(context, viewResult.View, viewResult.ViewData, viewResult.TempData, output);
viewResult.View.Render(viewContext, output);
return output.ToString();
}
finally
{
if (viewEngineResult != null) viewEngineResult.ViewEngine.ReleaseView(context, viewResult.View);
}
}
}
}