如何渲染一个Razor视图到ASP.NET MVC 3中的string?
我一直在search网站,但我能find的所有例子都是关于如何渲染部分控件.ascx
,或者依赖于控制器上下文。
我想要一个方法,使我能够提供视图和模型的相对path,并使用该模型将该视图渲染为string:
string result = Utility.RenderViewToString("~/Views/My/Profile.cshtml", model);
我能find的所有例子都是针对较老版本的MVC,或者根本就没有做我需要做的事情。
你可以用razorengine来实现。
string template = "Hello @Model.Name! Welcome to Razor!"; string result = Razor.Parse(template, new { Name = "World" });
它不依赖于控制器上下文 – 但是因为你不能使用Html帮助器(依赖于http上下文)。 但是使用剃刀作为string的模板引擎是完美的。
你可以检查这个链接。
提取内容从Render Razor视图转换为String 。 。
public static string RenderRazorViewToString(string viewName, object model) { ViewData.Model = model; using (var sw = new StringWriter()) { var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); viewResult.View.Render(viewContext, sw); return sw.GetStringBuilder().ToString(); } }
我为我创造了解决scheme。 它是将视图渲染成string的扩展。
public static class RenderPartialToStringExtensions { /// <summary> /// render PartialView and return string /// </summary> /// <param name="context"></param> /// <param name="partialViewName"></param> /// <param name="model"></param> /// <returns></returns> public static string RenderPartialToString(this ControllerContext context, string partialViewName, object model) { return RenderPartialToStringMethod(context, partialViewName, model); } /// <summary> /// render PartialView and return string /// </summary> /// <param name="context"></param> /// <param name="partialViewName"></param> /// <param name="viewData"></param> /// <param name="tempData"></param> /// <returns></returns> public static string RenderPartialToString(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData) { return RenderPartialToStringMethod(context, partialViewName, viewData, tempData); } public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData) { ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, partialViewName); if (result.View != null) { StringBuilder sb = new StringBuilder(); using (StringWriter sw = new StringWriter(sb)) { using (HtmlTextWriter output = new HtmlTextWriter(sw)) { ViewContext viewContext = new ViewContext(context, result.View, viewData, tempData, output); result.View.Render(viewContext, output); } } return sb.ToString(); } return String.Empty; } public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, object model) { ViewDataDictionary viewData = new ViewDataDictionary(model); TempDataDictionary tempData = new TempDataDictionary(); return RenderPartialToStringMethod(context, partialViewName, viewData, tempData); } }
而我们可以在Action中渲染视图
[HttpPost] public ActionResult GetTreeUnit(string id) { int _id = id.ExtractID(); string render = ControllerContext.RenderPartialToString("SomeView"); return Json(new { data = render }); }
虽然马克的答案是正确的,并为以前的版本工作。 但是现在这已经变得很糟糕,需要更换。
这里是我工作的新代码,你可以在Github上find更多有用的信息: Razor Engine
string template = "Hello @Model.Name! Welcome to Razor!"; string Result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });