2012-02-11 38 views
24

He estado buscando mucho en el sitio, pero todo lo que pude encontrar fueron ejemplos sobre cómo representar controles parciales .ascx, o depende de un contexto de controlador.¿Cómo renderizar una Razor View en una cadena en ASP.NET MVC 3?

Quiero un método que me permite proporciono la ruta relativa a la vista, y un modelo, y hacer que ese punto de vista con ese modelo en una cadena:

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

Todos los ejemplos que se podrían encontrar Were ya sea para versiones anteriores de MVC, o simplemente no hice lo que tengo que hacer aquí.

Respuesta

26

Puede lograrlo con el razorengine.

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

Y no se basa en el contexto del controlador - pero debido a que no son capaces de utilizar los ayudantes HTML (que se basan en el contexto HTTP). Pero es perfecto usar una afeitadora como motor de plantilla para cuerdas.

+1

¿Hay alguna manera de que esto funcione si tengo la plantilla de afeitar bloqueada en un archivo cshtml ?. Sé que es un poco tarde para la fiesta. –

+2

No se preocupe, todavía estoy por aquí :) Y claro, simplemente cargue el contenido a través de 'File.ReadAllText (path);' en la variable. – Marc

+0

¿Se pueden pasar objetos (modelos) a la vista? @Marc – Kennyomar

12

Puede consultar este enlace.

contenido extraído De Render Razor view to 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(); 
    } 
} 
+11

el tema es que ejemplo se requiere un contexto controlador, que no tengo de donde yo' Estoy intentando llamar a este método. – bevacqua

10

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

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

Y de lo que podemos hacer la vista en Acción

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

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

Aquí está el nuevo código que trabajó para mí y se puede encontrar información más útil en Github: Razor Engine

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