Подтвердить что ты не робот

Список ViewModel имеет значение null в действии

Я работаю над своим первым приложением ASP.NET MVC 3, и у меня есть представление, которое выглядит так:

@model IceCream.ViewModels.Note.NotesViewModel
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    @Html.TextBoxFor(m => m.Name)

    foreach (var item in Model.Notes)
    {
        @Html.EditorFor(m => item);
    }

    <input type="submit" value="Submit"/>
}

И у меня есть EditorTemplate, который выглядит так:

@model IceCream.ViewModels.Note.NoteViewModel
<div>
    @Html.HiddenFor(m => m.NoteID)
    @Html.TextBoxFor(m => m.NoteText)
    @Html.CheckBoxFor(m => m.IsChecked)
</div>

NotesViewModel выглядит так:

    public class NotesViewModel
    {
        public string Name { get; set; }
        public IEnumerable<NoteViewModel> Notes { get; set; }
    }

NoteViewModel выглядит так:

public class NoteViewModel
{
    public int NoteID { get; set; }
    public System.DateTime Timestamp { get; set; }
    public string NoteText { get; set; }
    public bool IsChecked { get; set; }
}

NotesViewModel заполняется просто отлично, когда он передается в представление. Однако, когда нажата кнопка отправки, действие контроллера, обрабатывающее сообщение, имеет только значение для свойства Name модели viewmodel. Свойство Notes - список заметок, которые были отмечены/не отмечены пользователем, - null. У меня есть разрыв между заполнением этих элементов TextBoxFor и CheckBoxFor при отображении представления и отправке ViewModel. Руководство по этому вопросу?


РЕШЕНИЕ Благодарим меня за Mystere Man за то, что вы меня прямо решили. Насколько я понимаю, по существу, меняя свой цикл на

@Html.EditorFor(m => m.Notes)

изменяет базовый HTML, который, как я понимаю, обеспечивает надлежащую привязку модели к сообщению. Если посмотреть на полученный HTML-код, я вижу, что для одного из Notes:

<div>
  <input id="Notes_0__NoteId" type="hidden" value="1" name="Notes[0].NoteId">
  <input id="Notes_0__NoteText" type="text" value="Texture of dessert was good." name="Notes[0].NoteText">
  <input id="Notes_0__IsChecked" type="checkbox" value="true" name="Notes[0].IsChecked>
</div>

Что отличается от этого HTML, сгенерированного моим исходным кодом:

<div>
   <input id="item_NoteId" type="hidden" value="1" name="item.NoteId>
   <input id="item_NoteText" type="text" value="Texture of dessert was good." name="item.NoteText" >
   <input id="item_IsChecked" type="checkbox" value="true" name="item.IsChecked">
</div>

Посредством прокрутки Notes, сгенерированный HTML по существу теряет ссылки на свойство viewmodel Notes, и, когда HTML заполняется правильно, установка значений флажка не имеет возможности передавать свои значения обратно в viewmodel, что, я думаю, является точкой привязки модели.

Итак, я узнал что-то, что хорошо.

4b9b3361

Ответ 1

Ты умный парень, поэтому посмотри на свое мнение. Затем рассмотрим, как генерируется HTML. Затем рассмотрите, как на обратной стороне, которую, как предполагается, должна знать модель Binder, для повторного заполнения Notes на основе сгенерированного HTML.

Я думаю, вы обнаружите, что ваш HTML не имеет достаточной информации в нем для Model Binder, чтобы понять это.

Рассмотрим это:

@EditorFor(m => Model.Notes)

Вместо цикла for, где вы в основном скрываете контекст из функции EditorFor.

Ответ 2

И для тех, кому просто нужен ответ как цикл for:

@for (int x = 0; x < Model.Notes.Count(); x++) {
    @Html.HiddenFor(m => m.Notes[x].NoteId)
    @Html.EditorFor(m => m.Notes[x].NoteText)
    @Html.EditorFor(m => m.Notes[x].IsChecked)
}