Части моих моделей неправильно восстанавливаются при обратной передаче.
Модели
public class DemographicsModel
{
public List<QuestionModel> Questions { get; set; }
}
public abstract class QuestionModel
{
[HiddenInput(DisplayValue = false)]
public int ID { get; set; }
[HiddenInput(DisplayValue = false)]
public string Title { get; set; }
}
public abstract class ChooseQuestionModel : QuestionModel
{
public abstract List<SelectListItem> Items { get; set; }
}
public class ChooseManyQuestionModel : ChooseQuestionModel
{
[Required]
[DataType("CheckBoxList")]
public override List<SelectListItem> Items { get; set; }
}
Просмотры
ChooseManyQuestionModel.cshtml
@model X.Y.Z.ChooseManyQuestionModel
<div class="Form Wide NoLabel">
<div class="Title">@this.Model.Title</div>
@Html.TypeStamp()
@Html.EditorFor(m => m.ID)
@Html.EditorFor(m => m.Title)
@Html.EditorFor(m => m.Items)
</div>
CheckBoxList.cshtml
@model IEnumerable<SelectListItem>
@if (!this.Model.IsNullOrEmpty())
{
foreach (var item in this.Model)
{
<div>
@Html.HiddenFor(m => item.Value)
@Html.HiddenFor(m => item.Text)
@Html.CheckBoxFor(m => item.Selected)
@Html.LabelFor(m => item.Selected, item.Text)
</div>
}
}
Я полагаю, что проблема заключается в CheckBoxList.cshtml, так как эти элементы не восстанавливаются при обратной передаче.Контроллер
public class AccountController : BaseController
{
public ActionResult Demographics()
{
return this.View(new DemographicsModel());
}
[HttpPost]
public ActionResult Demographics(DemographicsModel model)
{
return this.View(model);
}
}
При обратной передаче DemographicsModel
заполняется правильными типами (я использую MvcContrib для обработки привязки абстрактного типа).List<Question>
заполняется всеми правильными данными, включая идентификатор и заголовок каждого вопроса из скрытых полей.Тем не менее, List<SelectListItem>
в каждом вопросе имеет значение null
.
Обновление 1
Проблема определенно возникает из-за неправильного имени полей.Например, имена полей «item» генерируются следующим образом:
Questions_1__Items_item_Value
Когда они действительно должны выглядеть следующим образом (добавление индекса элемента и удаление ошибочного «item»):
Questions_1__Items_1__Value
Аналогично, идентификаторы полей создаются следующим образом (добавление индекса элемента и удаление ошибочного «элемента»):
Questions[1].Items.item.Value
Вместо:
Questions[1].Items[0].Value
ИспользованиеFiddler с правильными идентификаторами, отправляемыми обратно, модель построена правильно со всеми установленными переключателями и флажками.