关于asp.net mvc 3:从单个Controller动作返回多个部分视图?

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请求,则需要删除[HttpPost]装饰器并将JsonRequestBehavior.AllowGet添加到返回的JsonResult

1
return Json(new { totalValuesPartialView, summaryValuesPartialView }, JsonRequestBehavior.AllowGet);


也许这个解决方案可以帮助你:

http://www.codeproject.com/Tips/712187/Returning-More-Views-in-an-ASP-NET-MVC-Action