2011-01-14 16 views

Respuesta

149

utilizo un método estático en una clase que se llama Utilities.Common que pase vistas de vuelta al cliente como propiedades de JSON objetos constantemente así que tenía una necesidad de hacerlas a una cuerda. Aquí ya go:

public static string RenderPartialViewToString(Controller controller, string viewName, object model) 
{ 
    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.ToString(); 
    } 
} 

Esto funcionará para vistas completas, así como vistas parciales, solo cambia ViewEngines.Engines.FindPartialView-ViewEngines.Engines.FindView.

+5

enfríen funciona tanto para la maquinilla de afeitar y formularios web – Omu

+0

Me alegro de poder ayudar. – Chev

+13

FindView necesita otro parámetro ('masterName') que especifique null. También recomiendo guardar y restaurar (después de renderizar) controller.ViewData.Model en caso de que se llame al método en la instancia del controlador actual y se haya asignado el modelo antes de esta llamada. –

3

La respuesta aceptada por @Chev anterior es bueno, pero yo quería hacer que el resultado de una acción específica , no sólo una visión particular .

Además, tenía que ser capaz de pasar parámetros a esa acción en lugar de confiar en la inyección de un modelo.

Así me ocurrió con mi propio método, que puse en la clase base de mis controladores (ponerla a disposición de todos ellos):

protected string RenderViewResultAsString(ViewResult viewResult) 
    { 
     using (var stringWriter = new StringWriter()) 
     { 
      this.RenderViewResult(viewResult, stringWriter); 

      return stringWriter.ToString(); 
     } 
    } 

    protected void RenderViewResult(ViewResult viewResult, TextWriter textWriter) 
    { 
     var viewEngineResult = this.ViewEngineCollection.FindView(
      this.ControllerContext, 
      viewResult.ViewName, 
      viewResult.MasterName); 
     var view = viewEngineResult.View; 

     try 
     { 
      var viewContext = new ViewContext(
       this.ControllerContext, 
       view, 
       this.ViewData, 
       this.TempData, 
       textWriter); 

      view.Render(viewContext, textWriter); 
     } 
     finally 
     { 
      viewEngineResult.ViewEngine.ReleaseView(this.ControllerContext, view); 
     } 
    } 

Supongamos que tengo una acción llamada Foo que tiene un modelo objeto y algunos otros parámetros, que en conjunto influyen en lo que la vista va a utilizarse:

public ViewResult Foo(MyModel model, int bar) 
    { 
     if (bar == 1) 
      return this.View("Bar1"); 
     else 
      return this.View("Bar2", model); 
    } 

Ahora, si quiero obtener el resultado de llamar a la acción Foo, que pueden conseguir simplemente el ViewResult invocando la Foo método, y luego llamar RenderViewResultAsString para obtener el texto HTML:

var viewResult = this.Foo(model, bar); 

    var html = this.RenderViewResultAsString(viewResult); 
Cuestiones relacionadas