【问题标题】:In MVC3 Razor, how do I get the html of a rendered view inside an action?在 MVC3 Razor 中,如何在动作中获取渲染视图的 html?
【发布时间】:2011-06-09 04:37:56
【问题描述】:

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

是这样的吗:

public ActionResult Do()
{
    var html = RenderView("hello", model);
...
}

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor


    【解决方案1】:

    我在一个名为 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

    【讨论】:

    • FindView 需要另一个参数 (masterName),您可以将其指定为 null。此外,我建议保存和恢复(渲染后)controller.ViewData.Model,以防在当前控制器实例上调用该方法并且在此调用之前已分配模型。
    • 你也应该调用 viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View)
    • 效果很好,但我不想在我的实时代码中捕获和呈现异常。
    • 如果你在控制器内部调用它,那么只需传递this 作为控制器参数。 RenderPartialViewToString(this, "index", viewModel)。我确实认为没有更简单的方法来简单地调用视图引擎并取回字符串是很愚蠢的,但是在 ASP.NET 中,视图引擎需要引用控制器实例才能编译视图。我现在是一名 nodeJS 开发人员,node 中的视图引擎是完全独立的模块,您可以手动调用它们,也可以使用像 express 这样的 MVC 框架调用。
    • @PauloManuelSantos 我同意你的看法。我是几年前写的,我不知道在答案中包含错误处理我在想什么。我已经更新了排除尝试/捕获的答案。感谢您的反馈。
    【解决方案2】:

    上面@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);
    

    【讨论】:

      猜你喜欢
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多