Список ViewModel нулевой в действии

Я работаю над моим первым приложением 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 хорошо заполняется, когда она передается в вид. Однако, когда кнопка submit нажата, действие контроллера, обрабатывающего сообщение, имеет только значение для свойства Name видо-модели. Свойство Notes - список заметок, которые были проверены/не проверены пользователем - является нулевым. При отображении вида у меня возникает разрыв между заполнением элементов TextBoxFor и CheckBoxFor и отправкой обратно ViewModel. Руководство по этому поводу?


SOLUTION. Спасибо Тайному Человеку за то, что подставил меня. Как я понимаю, по сути, изменив мой цикл на

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

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

<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>

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

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

22
задан itsmatt 23 August 2011 в 11:21
поделиться