En MVC3 Razor, ¿cómo obtengo el html de una vista procesada dentro de una acción?

¿Alguien sabe cómo obtener el html generado de una vista dentro de una acción?

Es algo como esto:

public ActionResult Do() { var html = RenderView("hello", model); ... } 

Utilizo un método estático en una clase que denominé Utilities.Common . Paso las vistas al cliente como propiedades de los objetos JSON constantemente, así que tuve la necesidad de renderizarlas en una cadena. Aqui tienes:

 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, simplemente cambie ViewEngines.Engines.FindPartialView a ViewEngines.Engines.FindView .

La respuesta aceptada por @Chev anterior es buena, pero quería mostrar el resultado de una acción específica, no solo una vista particular.

Además, necesitaba poder pasar parámetros a esa acción en lugar de confiar en la inyección de un modelo.

Así que ideé mi propio método, que puse en la clase base de mis controladores (poniéndolos a disposición de todos):

  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 toma un objeto modelo y algunos otros parámetros, que en conjunto influyen en qué vista se usará:

  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 , simplemente puedo obtener ViewResult invocando el método Foo y luego llamar a RenderViewResultAsString para obtener el texto HTML:

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