Кто-нибудь знает, как получить сгенерированный html представления внутри действия?
Это что-то вроде этого:
public ActionResult Do()
{
var html = RenderView("hello", model);
...
}
Кто-нибудь знает, как получить сгенерированный html представления внутри действия?
Это что-то вроде этого:
public ActionResult Do()
{
var html = RenderView("hello", model);
...
}
Я использую статический метод в классе, который я назвал Utilities.Common
. Я передаю представления обратно клиенту как свойства объектов JSON постоянно, поэтому мне пришлось отобразить их в строку. Здесь 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();
}
}
Это будет работать для полных представлений, а также для частичных представлений, просто измените ViewEngines.Engines.FindPartialView
на ViewEngines.Engines.FindView
.
Принятый ответ от @Chev выше хорош, но я хотел отобразить результат определенного действия, а не только определенного вида.
Кроме того, мне нужно было иметь возможность передавать параметры этому действию, а не полагаться на инъекцию модели.
Итак, я придумал свой собственный метод, который я ввел в базовый класс моих контроллеров (сделав его доступным для всех):
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);
}
}
Предположим, что у меня есть действие с именем Foo
, которое принимает объект модели и некоторые другие параметры, которые вместе влияют на то, какой вид будет использоваться:
public ViewResult Foo(MyModel model, int bar)
{
if (bar == 1)
return this.View("Bar1");
else
return this.View("Bar2", model);
}
Теперь, если я хочу получить результат действия вызова Foo
, я могу просто получить ViewResult
, вызвав метод Foo
, а затем вызвать RenderViewResultAsString
, чтобы получить текст HTML:
var viewResult = this.Foo(model, bar);
var html = this.RenderViewResultAsString(viewResult);