Я работаю над моим первым приложением 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, в чем, я полагаю, и заключается смысл привязки модели.
Так что я узнал кое-что, что хорошо.