我需要从Ajax调用更新多个,我很困惑,因为在如何从Controller Action方法返回这些多个视图。从单个控制器操作返回多个部分视图?
21
A
回答
42
您只能从函数中返回一个值,所以不能从一个操作方法返回多个部分。
如果您试图将两个模型返回到一个视图,请创建一个包含要发送的两个模型的视图模型,并将视图的模型设置为新的ViewModel。 例如
您的视图模型会是什么样子:
public class ChartAndListViewModel
{
public List<ChartItem> ChartItems {get; set;};
public List<ListItem> ListItems {get; set;};
}
那么你的控制器动作将是:
public ActionResult ChartList()
{
var model = new ChartAndListViewModel();
model.ChartItems = _db.getChartItems();
model.ListItems = _db.getListItems();
return View(model);
}
最后你的看法是:
@model Application.ViewModels.ChartAndListViewModel
<h2>Blah</h2>
@Html.RenderPartial("ChartPartialName", model.ChartItems);
@Html.RenderPartial("ListPartialName", model.ListItems);
4
14
这里有一个很好的例子....
http://rhamesconsulting.com/2014/10/27/mvc-updating-multiple-partial-views-from-a-single-ajax-action/
创建的helper方法包装起来的局部视图...
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();
}
}
创建一个控制器动作捆绑多个部分视图....
[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 });
}
每个局部视图可以使用它的ow n模型(如果需要),或者可以与本例中的相同模型捆绑在一起。
然后,使用一个AJAX调用更新所有章节一气呵成:
$('#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请求,你需要删除[HttpPost]
装饰和添加JsonRequestBehavior.AllowGet
到返回JsonResult
:
return Json(new { totalValuesPartialView, summaryValuesPartialView }, JsonRequestBehavior.AllowGet);
相关问题
- 1. 从控制器返回部分视图?
- 2. 使用多个控制器操作的视图,返回到初始视图
- 3. 返回两个局部视图一个从控制器
- 4. 从另一个视图控制器的视图控制器触发器操作
- 5. 如何将数据从多个控制器返回到视图?
- 6. 从MVC 5控制器返回部分视图和JSON
- 7. 如何验证从控制器返回的部分视图
- 8. 从控制器返回部分视图时重新加载jQuery?
- 9. Telerik MVC3 Razor Grid - 从控制器返回的部分视图
- 10. 从控制器呈现多个部分视图
- 11. 多个控制器从一个视图
- 12. MVC3两个控制器操作可以返回一个视图吗?
- 13. 如何从控制器返回一个视图到一个iFrame
- 14. 从一个控制器视图到另一个控制器视图的ASP.NET MVC 3 Razor渲染部分视图
- 15. 在MVC3和Razor中从单个动作返回多个视图
- 16. Xcode - 从多个视图控制器访问一个视图控制器
- 17. ZF2 - 控制器中多个操作的相同视图文件
- 18. 呈现在视图中返回部分视图的操作
- 19. 将多个视图(&nibs)添加到单个视图控制器
- 20. 用于iPhone上单个视图的多个视图控制器
- 21. 解除视图控制器不会返回到前一个视图控制器
- 22. 从部分视图返回部分html?
- 23. 从控制器呈现部分视图
- 24. 从控制器更新部分视图
- 25. 返回一个对象返回到根视图控制器
- 26. 获取部分视图操作和控制器负责岗位
- 27. ASP.NET MVC 3控制器部分视图操作
- 28. asp.net MVC部分视图控制器操作
- 29. 从另一个视图控制器返回时,UICollectionView复制单元格
- 30. 从部分视图使用Ajax.BeginForm,表单操作使用父控制器,而不是定义的控制器
你想达到什么目的? –
我有一个包含两个部分视图的页面,其中一个显示图表,另一个显示在图表中的项目列表在两个不同的部分视图中显示。现在对于不同的分组,这两个值都会改变,一个明显的解决办法可能是使它们成为我想要避免的单个局部视图。独立地,他们可以在我的应用程序中更频繁地使用。 – Nikshep
你为什么不简单地做两个Ajax调用? – frennky