Возвращение нескольких частичных представлений из одного действия контроллера? - PullRequest
28 голосов
/ 04 августа 2011

Мне нужно обновить Multiple из вызова Ajax, я не совсем понимаю, как вернуть эти несколько представлений из метода Controller Action.

Ответы [ 3 ]

51 голосов
/ 04 августа 2011

Вы можете вернуть только одно значение из функции, поэтому вы не можете вернуть несколько частичных значений из одного метода действия.
Если вы пытаетесь вернуть две модели в одно представление, создайте модель представления, содержащую обе модели, которые вы хотите отправить, и сделайте модель вашего представления новой 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);
19 голосов
/ 23 января 2016

Здесь очень хороший пример ....
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);
5 голосов
/ 17 февраля 2014

Может быть, это решение поможет вам:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...