Пользовательская эквивалентная модель ActionResult для всех PartialViews

Я создал следующий пользовательский ActionResult, который возвращает несколько частичных представлений.

public class MultiplePartialViewsResult : ActionResult
{
    private const string Separator = "-";
    private PartialViewResult[] _partialViews;

    public MultiplePartialViewsResult(params PartialViewResult[] partialViews)
    {
        _partialViews = partialViews;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        foreach (var partialView in _partialViews)
        {
            partialView.ExecuteResult(context);
            context.HttpContext.Response.Output.Write(Separator);
        }
    }
}

И затем я использую его следующим образом:

return new MultiplePartialViewsResult(
             PartialView("~/Views/RowSumView.cshtml", new List<double>() { 1.0 }),
             PartialView("~/Views/ColumnSumView.cshtml", new List<double>() { 2.0 }));

Но если я помещаю точку останова в конструктор MultiplePartialViewsResult, я вижу, что модель в обоих случаях равна 2.0. Он переопределяет все модели с последней моделью, указанной в массиве.

Попробуйте создать пару PartialViews в методе и присвоить его переменной. Тогда вы заметите, что все они имеют эквивалентную модель.

Ответы

Ответ 1

Вы можете инициализировать объект MultiplePartialViewsResult следующим образом с помощью новых представлений ViewData​​strong > / ViewData.Model. (отлично работает для меня):

return new MultiplePartialViewsResult(
    //PartialView("~/Views/RowSumView.cshtml", new List<double>() { 1.0 }),
    //PartialView("~/Views/ColumnSumView.cshtml", new List<double>() { 2.0 })
    new PartialViewResult() { ViewName = "~/Views/RowSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 1.0 } } },
    new PartialViewResult() { ViewName = "~/Views/ColumnSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 2.0 } } }
);

Результат пользовательского действия:

public class MultiplePartialViewsResult : ActionResult {
    private const string Separator = "-";
    private PartialViewResult[] _partialViews;

    public MultiplePartialViewsResult(params PartialViewResult[] partialViews) {
        _partialViews = partialViews;
    }

    public override void ExecuteResult(ControllerContext context) {
        foreach(var partialView in _partialViews) {
            partialView.ExecuteResult(context);
            context.HttpContext.Response.Output.Write(Separator);
        }
    }
}

Контроллер:

public ActionResult Index() {
    return View();
}
public ActionResult FakeAction() {
    return new MultiplePartialViewsResult(
        //PartialView("~/Views/RowSumView.cshtml", new List<double>() { 1.0 }),
        //PartialView("~/Views/ColumnSumView.cshtml", new List<double>() { 2.0 })
        new PartialViewResult() { ViewName = "~/Views/RowSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 1.0 } } },
        new PartialViewResult() { ViewName = "~/Views/ColumnSumView.cshtml", ViewData = new ViewDataDictionary() { Model = new List<double>() { 2.0 } } }
    );
}

Просмотров:

Индекс

@Html.Action("FakeAction")

ColumnSumView.cshtml/RowSumView.cshtml:

@model List<double>
<ul>
    @foreach(double item in Model) {
        <li>@item</li>
    }
</ul>