Я работаю над своим первым приложением ASP.NET MVC 3, и у меня есть View, который выглядит следующим образом:
@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 модели представления.Свойство Notes - список заметок, которые были проверены / не проверены пользователем - равно нулю.У меня есть разрыв между заполнением этих элементов TextBoxFor и CheckBoxFor при отображении представления и отправке ViewModel.Руководство по этому вопросу?
РЕШЕНИЕ Спасибо, Мистер Мэн, за то, что вы меня прямо поняли.Как я понимаю, по сути, изменяя мой цикл на
@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>
Зацикливая Notes, сгенерированный HTML по существу теряет все ссылки на свойство Notes в viewmodel, и, хотя HTML заполняется правильно, установка значений флажков не может передать их значения обратно в viewmodel, что, я полагаю, является точкойобвязки модели.
Итак, я кое-что узнал, и это хорошо.