【发布时间】:2011-06-09 04:37:56
【问题描述】:
有人知道如何在动作中获取生成的视图 html 吗?
是这样的吗:
public ActionResult Do()
{
var html = RenderView("hello", model);
...
}
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 razor
有人知道如何在动作中获取生成的视图 html 吗?
是这样的吗:
public ActionResult Do()
{
var html = RenderView("hello", model);
...
}
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 razor
我在一个名为 Utilities.Common 的类中使用静态方法,我不断地将视图作为 JSON 对象的属性传递回客户端,因此我需要将它们呈现为字符串。来吧:
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。
【讨论】:
masterName),您可以将其指定为 null。此外,我建议保存和恢复(渲染后)controller.ViewData.Model,以防在当前控制器实例上调用该方法并且在此调用之前已分配模型。
this 作为控制器参数。 RenderPartialViewToString(this, "index", viewModel)。我确实认为没有更简单的方法来简单地调用视图引擎并取回字符串是很愚蠢的,但是在 ASP.NET 中,视图引擎需要引用控制器实例才能编译视图。我现在是一名 nodeJS 开发人员,node 中的视图引擎是完全独立的模块,您可以手动调用它们,也可以使用像 express 这样的 MVC 框架调用。
上面@Chev 接受的答案很好,但我想渲染特定动作的结果,而不仅仅是特定的view。
此外,我需要能够将参数传递给该操作,而不是依赖于注入模型。
所以我想出了我自己的方法,我把它放在我的控制器的基类中(让他们都可以使用它):
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的结果,我可以简单地通过调用Foo方法得到ViewResult,然后调用RenderViewResultAsString得到HTML文本:
var viewResult = this.Foo(model, bar);
var html = this.RenderViewResultAsString(viewResult);
【讨论】: