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);
enfríen funciona tanto para la maquinilla de afeitar y formularios web – Omu
Me alegro de poder ayudar. – Chev
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. –