Список ViewModel является нулевым в действии - PullRequest
22 голосов
/ 23 августа 2011

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

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

Ответы [ 2 ]

15 голосов
/ 23 августа 2011

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

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

Учтите это:

@EditorFor(m => Model.Notes)

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

3 голосов
/ 09 июля 2014

А для тех, кто просто хочет получить ответ в виде цикла:

@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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...