通过调用操作方法将局部视图渲染为字符串

时间:2012-03-20 00:37:27

标签: asp.net-mvc-3 razor

我一直在尝试使用方法轮廓渲染视图到字符串:

Render a view as a string

问题是我需要调用我的控制器操作,这在调用View.Render时不会发生。

var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
viewResult.View.Render(viewContext, sw);

我的问题是,如何在传递路径的任意控制器上调用RenderAction?我试图将一些部分视图的结果合并到一个结果中,然后传回浏览器。

我的代码到目前为止。除了不调用action方法之外的其他工作。

    public static string RenderPartialViewToString(this Controller controller, string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = controller.ControllerContext.RouteData.GetRequiredString("action");

        controller.ViewData.Model = model;

        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
            var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
            viewResult.View.Render(viewContext, sw);

            return sw.GetStringBuilder().ToString();
        }
    }



        var route = new RouteData();
        route.Values.Add("controller", "Test1");
        route.Values.Add("action", "Index");

        var controller1 = new Test1Controller();

        var controllerContext = new ControllerContext(new RequestContext(this.ControllerContext.HttpContext, route), controller1);
        controller1.ControllerContext = controllerContext;
        var viewString = controller1.RenderPartialViewToString("~/Views/Test1/Index.cshtml", (object)model);

我的目标是创建一个简单的CMS系统,将多个控制器操作/视图的结果组合在一起,并将它们输出到布局中。

我有一个主控制器操作,可以从数据库中检索页面描述。代码循环遍历其他控制器的列表并调用它们的动作,这将导致动态对象模型和部分html片段列表被传递到自定义WebViewPage。

1 个答案:

答案 0 :(得分:0)

我有点不确定你想要完成什么。但是,除了RenderPartialViewToString之外,还有一种扩展方法。要在控制器操作中使用,您可以执行以下简单操作:

var result = this.RenderPartialViewToString("Index", model)

其中model是“索引”视图中使用的强类型模型。例如,如果您想要将视图呈现为字符串以在JSON操作中使用,则可以返回JSONResult:

return new JsonResult
           {
               JsonRequestBehavior = JsonRequestBehavior.AllowGet,
               Data = new {html = this.RenderPartialViewToString("Index", model)}
           };