在MVC3 Razor中,如何在动作中获取渲染视图的html?

Omu*_*Omu 90 asp.net-mvc razor asp.net-mvc-3

有人知道如何在动作中获取生成的视图html吗?

它是这样的:

public ActionResult Do()
{
    var html = RenderView("hello", model);
...
}
Run Code Online (Sandbox Code Playgroud)

Che*_*hev 152

我在类I中使用静态方法,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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将适用于完整视图以及部分视图,只需更改ViewEngines.Engines.FindPartialViewViewEngines.Engines.FindView.

  • FindView需要另一个参数(`masterName`),你可以指定null.我还建议保存和恢复(渲染后)controller.ViewData.Model的情况下调用该方法对当前控制器实例,这个调用之前的模型已被分配. (14认同)
  • 很酷,它适用于剃须刀和网络表格 (5认同)
  • @PauloManuelSantos我同意你的看法.我在几年前写过,我不知道我在想什么,包括在答案中的错误处理.我已更新了排除try/catch的答案.感谢您的反馈. (5认同)
  • 您还应该调用viewResult.ViewEngine.ReleaseView(controller.ControllerContext,viewResult.View) (4认同)
  • 它工作得很好,但我不想在我的实时代码中捕获并呈现异常. (3认同)
  • 如果你是从控制器本身调用它,那么只需传递`this`作为控制器参数.`RenderPartialViewToString(this,"index",viewModel)`.我认为简单地调用视图引擎并获取字符串没有更简单的方法是愚蠢的,但在ASP.NET中,视图引擎需要引用控制器实例才能编译视图.我现在是nodeJS开发人员,节点中的视图引擎是完全独立的模块,您可以手动调用或使用[express](http://expressjs.com)等MVC框架. (3认同)
  • 此外,你不需要做sw.GetStringBuilder().toString()方法,sw.ToString()会做刚刚好. (2认同)
  • 这对我来说是一个问题,因为Value不能为null.参数名称:controllerContext如何解决这个问题? (2认同)