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