La risposta accettata dalla @Chev sopra è buono, ma ho voluto rendere il risultato di una specifica azione , non solo una particolare vista.
Inoltre, avevo bisogno di essere in grado di passare i parametri a quell'azione piuttosto che fare affidamento sull'iniettare un modello.
Così mi si avvicinò con il mio metodo, che ho messo nella classe base dei miei controllori (rendendolo disponibile a tutti loro):
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);
}
}
Supponiamo che io abbia un'azione chiamata Foo
che prende un modello oggetto e alcuni altri parametri, che insieme influenzano ciò che vista verrà utilizzato:
public ViewResult Foo(MyModel model, int bar)
{
if (bar == 1)
return this.View("Bar1");
else
return this.View("Bar2", model);
}
Ora, se voglio ottenere il risultato della chiamata azione Foo
, posso semplicemente ottenere il ViewResult
invocando la Foo
metodo, e quindi chiamare RenderViewResultAsString
per ottenere il testo HTML:
var viewResult = this.Foo(model, bar);
var html = this.RenderViewResultAsString(viewResult);
raffreddare funziona sia per rasoio e webforms – Omu
Glad ho potuto fare. – Chev
FindView necessita di un altro parametro ('masterName') che specifichi null. Raccomando anche di salvare e ripristinare (dopo il rendering) controller.ViewData.Model nel caso in cui il metodo venga chiamato sull'istanza del controller corrente e il modello sia stato assegnato prima di questa chiamata. –