Сбой состояния модели MVC3 после перехода на использование ViewModel

#asp.net-mvc-3 #viewmodel

#asp.net-mvc-3 #viewmodel

Вопрос:

Я изменил свой контроллер, чтобы передавать VoucherBatchViewModel вместо VoucherBatch

  [HttpPost]
    public ActionResult Edit(Guid id, VoucherBatchViewModel voucherBatchViewModel)
    {
        if (!ModelState.IsValid)
        {
            SetupDropDowns();
  

И виртуальная машина:

  public class VoucherBatchViewModel
{
    public VoucherBatch VoucherBatchInVM { get; set; }
    public string CreationReference { get; set; }
    public int NumberToMove { get; set; }
    public int VoucherCodeLength { get; set; }
}
  

Вопрос: Почему мой ModelState недействителен? Выпадающий список не заполнил правильное поле в ViewModel. HTML выдает правильное

 <div class="editor-field">
    @Html.DropDownList("VoucherProviderId",
            new SelectList(ViewBag.VoucherProviders as System.Collections.IEnumerable,
            "Id", "Name", Model.VoucherBatchInVM.VoucherProviderId))
  

и Edit get содержит это, которое я использую для заполнения выпадающего списка.

  ViewBag.VoucherProviders = uow.VoucherProviders.OrderBy(v => v.Name).ToList();
  

HTML:

     <select id="VoucherProviderId" name="VoucherProviderId"><option value="0469f9ba-c4ea-401a-86f1-095208c6a7fb">Name</option>
<option selected="selected" value="e0aeed44-3574-46f1-a493-0a6a87948942">Voucher Provider 1</option>
<option value="5abe1158-282b-4330-9b11-01de503a2f16">Voucher Provider 2</option>
  

Ответ №1:

Не вижу никакого VoucherProviderId свойства в вашем VoucherBatchViewModel . Таким образом, ваш HTML недействителен. Это должно быть:

 <select id="VoucherProviderId" name="VoucherBatchInVM.VoucherProviderId">
    ...
</select>
  

И для достижения этой разметки я бы рекомендовал вам использовать строго типизированные помощники:

 @Html.DropDownListFor(
    x => x.VoucherBatchInVM.VoucherProviderId,
    new SelectList(ViewBag.VoucherProviders as System.Collections.IEnumerable, "Id", "Name")
)
  

И, пожалуйста, замените это, ViewBag от которого меня тошнит, строго типизированным свойством model:

 @Html.DropDownListFor(
    x => x.VoucherBatchInVM.VoucherProviderId,
    new SelectList(Model.VoucherProviders, "Id", "Name")
)
  

Комментарии:

1. отличная работа. Я смеялся, когда прочитал вашу любовь к ViewBag! Поэтому я изменил его на строго типизированный и буду использовать это в будущем 🙂