我一直在尝试使用方法轮廓渲染视图到字符串:
问题是我需要调用我的控制器操作,这在调用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。
答案 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)}
};