Мне нужно обновить Multiple от Ajax-вызова, я запутался как в том, как вернуть эти множественные представления из метода Action Controller.
Возвращение нескольких частичных представлений из одного действия контроллера?
Ответ 1
Вы можете вернуть только одно значение из функции, чтобы вы не могли возвращать несколько партикулов из одного метода действий.
Если вы пытаетесь вернуть две модели в одно представление, создайте модель представления, содержащую обе модели, которые вы хотите отправить, и сделайте модель представления новой 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);
Ответ 2
Здесь очень хороший пример...
http://rhamesconsulting.com/2014/10/27/mvc-updating-multiple-partial-views-from-a-single-ajax-action/
Создайте вспомогательный метод для пакетного просмотра...
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 });
}
Каждый частичный вид может использовать свою собственную модель, если требуется, или может быть объединен в ту же модель, что и в этом примере.
Затем используйте вызов 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);
Ответ 3
Возможно, это решение может вам помочь:
http://www.codeproject.com/Tips/712187/Returning-More-Views-in-an-ASP-NET-MVC-Action