¿Cómo renderizar una Razor View a una cadena en ASP.NET MVC 3?

He estado buscando mucho en el sitio, pero todo lo que pude encontrar fueron ejemplos sobre cómo representar controles parciales .ascx , o dependía de un contexto de controlador.

Quiero un método que me permita proporcionar solo la ruta relativa a la vista, y un modelo, y renderizar esa vista con ese modelo en una cadena:

 string result = Utility.RenderViewToString("~/Views/My/Profile.cshtml", model); 

Todos los ejemplos que pude encontrar fueron para versiones anteriores de MVC, o simplemente no hice lo que tengo que hacer aquí.

Puedes lograr eso con el razorengine .

 string template = "Hello @Model.Name! Welcome to Razor!"; string result = Razor.Parse(template, new { Name = "World" }); 

Y no depende del contexto del controlador, pero debido a eso no puede usar los helpers Html (que dependen del contexto http). Pero es perfecto usar una afeitadora como motor de plantilla para cuerdas.

Puedes consultar este enlace.

contenido extraído De la vista Render Razor a 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(); } } 

Yo había creado una solución para mí. Es la extensión que convierte la vista en una cadena.

 public static class RenderPartialToStringExtensions { ///  /// render PartialView and return string ///  ///  ///  ///  ///  public static string RenderPartialToString(this ControllerContext context, string partialViewName, object model) { return RenderPartialToStringMethod(context, partialViewName, model); } ///  /// render PartialView and return string ///  ///  ///  ///  ///  ///  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); } } 

Y que podemos renderizar vista en acción

 [HttpPost] public ActionResult GetTreeUnit(string id) { int _id = id.ExtractID(); string render = ControllerContext.RenderPartialToString("SomeView"); return Json(new { data = render }); } 

Aunque la respuesta de Marc es correcta, funciona para versiones anteriores. Pero eso ahora es obseleto y debe ser reemplazado.

Aquí está el nuevo código que funcionó para mí y puedes encontrar más información útil sobre Github: Razor Engine

 string template = "Hello @Model.Name! Welcome to Razor!"; string Result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });