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


90

有谁知道如何获取动作内部视图的生成的html?

是这样的吗?

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

Answers:


152

我在一个名为Utilities.CommonI 的类中使用静态方法,将视图作为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


14
FindView需要另一个参数(masterName),您可以将其指定为null。另外,我建议保存并还原(在渲染之后)controller.ViewData.Model,以防在当前控制器实例上调用该方法并且在此调用之前已分配了模型。
2011年

4
您还应该调用viewResult.ViewEngine.ReleaseView(controller.ControllerContext,viewResult.View)
sjmeverett

3
它很好用,但是我不想在实时代码中捕获并呈现异常。
pauloya

3
如果要从控制器本身内部调用它,则只需将其this作为控制器参数传递。RenderPartialViewToString(this, "index", viewModel)。我确实认为很傻,没有简单的方法可以简单地调用视图引擎并返回字符串,但是在ASP.NET中,视图引擎需要引用控制器实例才能编译视图。我现在是一个nodeJS开发人员,node中的视图引擎是整个单独的模块,您可以手动调用它们,也可以使用诸如express的MVC框架调用它们。
CHEV

5
@PauloManuelSantos我同意你的观点。我是几年前写的,我不知道我在想什么,因为答案中包含错误处理。我已经更新了答案,以排除try / catch。感谢您的反馈。
CHEV

4

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

现在,如果我想获取调用action的结果Foo,我可以简单地ViewResult通过调用Foo方法RenderViewResultAsString来获取,然后调用以获取HTML文本:

    var viewResult = this.Foo(model, bar);

    var html = this.RenderViewResultAsString(viewResult);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.