Returning Multiple partial views from single Controller action?
我需要从Ajax调用更新Multiple,我很困惑如何从Controller Action方法返回这些Multiple视图。
您只能从函数返回一个值,因此您无法从一个操作方法返回多个部分。
如果您尝试将两个模型返回到一个视图,请创建一个包含要发送的两个模型的视图模型,并将视图的模型设置为新的ViewModel。
例如。
您的视图模型如下所示:
1 2 3 4 5 | public class ChartAndListViewModel { public List<ChartItem> ChartItems {get; set;}; public List<ListItem> ListItems {get; set;}; } |
然后您的控制器操作将是:
1 2 3 4 5 6 7 8 | public ActionResult ChartList() { var model = new ChartAndListViewModel(); model.ChartItems = _db.getChartItems(); model.ListItems = _db.getListItems(); return View(model); } |
最后你的观点是:
1 2 3 4 5 6 7 | @model Application.ViewModels.ChartAndListViewModel Blah @Html.RenderPartial("ChartPartialName", model.ChartItems); @Html.RenderPartial("ListPartialName", model.ListItems); |
这里有一个很好的例子....
MVC – Updating multiple partial views from a single (AJAX) action
创建一个帮助方法来打包局部视图...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public static string RenderRazorViewToString(ControllerContext controllerContext, string viewName, object model) { controllerContext.Controller.ViewData.Model = model; using (var stringWriter = new StringWriter()) { var viewResult = ViewEngines.Engines.FindPartialView(controllerContext, viewName); var viewContext = new ViewContext(controllerContext, viewResult.View, controllerContext.Controller.ViewData, controllerContext.Controller.TempData, stringWriter); viewResult.View.Render(viewContext, stringWriter); viewResult.ViewEngine.ReleaseView(controllerContext, viewResult.View); return stringWriter.GetStringBuilder().ToString(); } } |
创建一个控制器动作来捆绑多个部分视图....
1 2 3 4 5 6 7 8 9 10 | [HttpPost] public JsonResult GetResults(int someExampleInput) { MyResultsModel model = CalculateOutputData(someExampleInput); var totalValuesPartialView = RenderRazorViewToString(this.ControllerContext,"_TotalValues", model.TotalValuesModel); var summaryValuesPartialView = RenderRazorViewToString(this.ControllerContext,"_SummaryValues", model.SummaryValuesModel); return Json(new { totalValuesPartialView, summaryValuesPartialView }); } |
如果需要,每个局部视图都可以使用自己的模型,或者可以捆绑到与此示例中相同的模型中。
然后使用AJAX调用一次更新所有部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $('#getResults').on('click', function () { $.ajax({ type: 'POST', url:"/MyController/GetResults", dataType: 'json', data: { someExampleInput: 10 }, success: function (result) { if (result != null) { $("#totalValuesPartialView").html(result.totalValuesPartialView); $("#summaryValuesPartialView").html(result.summaryValuesPartialView); } else { alert('Error getting data.'); } }, error: function () { alert('Error getting data.'); } }); }); |
如果要将此方法用于GET请求,则需要删除
1 | return Json(new { totalValuesPartialView, summaryValuesPartialView }, JsonRequestBehavior.AllowGet); |
也许这个解决方案可以帮助你:
http://www.codeproject.com/Tips/712187/Returning-More-Views-in-an-ASP-NET-MVC-Action