Ответ 1
Ваша модель null
, потому что способ ввода входов в вашу форму означает, что связующее устройство модели не имеет возможности различать элементы. Прямо сейчас, этот код:
@foreach (var planVM in Model)
{
@Html.Partial("_partialView", planVM)
}
не предоставляет какой-либо индекс этим элементам. Поэтому он будет генерировать HTML-вывод следующим образом:
<input type="hidden" name="yourmodelprefix.PlanID" />
<input type="hidden" name="yourmodelprefix.CurrentPlan" />
<input type="checkbox" name="yourmodelprefix.ShouldCompare" />
Однако, поскольку вы хотите привязать к коллекции, вам нужны ваши элементы формы, которые будут называться с индексом, например:
<input type="hidden" name="yourmodelprefix[0].PlanID" />
<input type="hidden" name="yourmodelprefix[0].CurrentPlan" />
<input type="checkbox" name="yourmodelprefix[0].ShouldCompare" />
<input type="hidden" name="yourmodelprefix[1].PlanID" />
<input type="hidden" name="yourmodelprefix[1].CurrentPlan" />
<input type="checkbox" name="yourmodelprefix[1].ShouldCompare" />
Этот индекс - это то, что позволяет привязке модели связывать отдельные фрагменты данных, позволяя ему создавать правильную модель. Итак, вот что я предлагаю вам сделать, чтобы исправить это. Вместо того, чтобы перебирать вашу коллекцию, используя частичный вид, вместо этого используйте силу шаблонов. Вот шаги, которые вам нужно выполнить:
- Создайте папку
EditorTemplates
внутри текущей папки просмотра (например, если ваше представлениеHome\Index.cshtml
, создайте папкуHome\EditorTemplates
). - Создайте строго типизированное представление в этом каталоге с именем, которое соответствует вашей модели. В вашем случае это будет
PlanCompareViewModel.cshtml
.
Теперь все, что у вас есть в частичном представлении, хочет войти в этот шаблон:
@model PlanCompareViewModel
<div>
@Html.HiddenFor(p => p.PlanID)
@Html.HiddenFor(p => p.CurrentPlan)
@Html.CheckBoxFor(p => p.ShouldCompare)
<input type="submit" value="Compare"/>
</div>
Наконец, ваше родительское представление упрощено:
@model IEnumerable<PlanCompareViewModel>
@using (Html.BeginForm("ComparePlans", "Plans", FormMethod.Post, new { id = "compareForm" }))
{
<div>
@Html.EditorForModel()
</div>
}
DisplayTemplates
и EditorTemplates
достаточно умны, чтобы знать, когда они обрабатывают коллекции. Это означает, что они автоматически генерируют правильные имена, включая индексы, для ваших элементов формы, чтобы вы могли корректно привязать модель к коллекции.