Czy ktoś wie, jak uzyskać wygenerowany HTML widoku wewnątrz działania?W MVC3 Razor, jak mogę uzyskać HTML renderowanego widoku wewnątrz akcji?
Czy jest coś takiego:
public ActionResult Do()
{
var html = RenderView("hello", model);
...
}
Czy ktoś wie, jak uzyskać wygenerowany HTML widoku wewnątrz działania?W MVC3 Razor, jak mogę uzyskać HTML renderowanego widoku wewnątrz akcji?
Czy jest coś takiego:
public ActionResult Do()
{
var html = RenderView("hello", model);
...
}
używam metody statyczne w klasie I zwanego Utilities.Common
mijam widoki z powrotem do klienta jako właściwości JSON obiektów stale więc miałem potrzebę uczynienia ich do ciąg znaków. Tu 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();
}
}
To będzie działać na pełnym widokiem, a także częściowym widokiem, wystarczy zmienić ViewEngines.Engines.FindPartialView
do ViewEngines.Engines.FindView
.
Przyjęty przez @Chev powyżej odpowiedź jest dobra, ale chciałem, aby uczynić wynik konkretnej działania, a nie tylko konkretnej widzenia.
Potrzebowałem również móc przekazywać parametry do tego działania, a nie polegać na wstrzykiwaniu modelu.
Więc wymyślił własną metodę, że mogę umieścić w klasie bazowej moich kontrolerami (udostępnianie ich wszystkich):
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);
}
}
Załóżmy, że mam działanie nazywa Foo
że trwa model przedmiot i niektóre inne parametry, które wpływają na to, co razem widok będzie używany:
public ViewResult Foo(MyModel model, int bar)
{
if (bar == 1)
return this.View("Bar1");
else
return this.View("Bar2", model);
}
teraz, jeśli chcę uzyskać wynik wywołania działania Foo
, mogę po prostu uzyskać ViewResult
powołując się Foo
metoda, a następnie zadzwonić RenderViewResultAsString
uzyskać tekst HTML:
var viewResult = this.Foo(model, bar);
var html = this.RenderViewResultAsString(viewResult);
ostygnie to działa zarówno brzytwa i webforms – Omu
Cieszę się, że mogłem pomóc. – Chev
FindView wymaga innego parametru ('masterName'), który można określić jako zero. Polecam również zapisywanie i przywracanie (po renderowaniu) controller.ViewData.Model w przypadku wywołania metody na bieżącej instancji kontrolera i model został przypisany przed tym wywołaniem. –