MVC3 ModelState завершается ошибкой после перехода на использование ViewModel - PullRequest
1 голос
/ 06 апреля 2011

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

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

И vm:

 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 содержится это, которое я использую для заполнения DropDown.

 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 Ответ

0 голосов
/ 06 апреля 2011

Невозможно увидеть 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, которое вызывает рвоту, на строго типизированное свойство модели:

@Html.DropDownListFor(
    x => x.VoucherBatchInVM.VoucherProviderId,
    new SelectList(Model.VoucherProviders, "Id", "Name")
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...