asp.net - webapi - httpresponseexception




ViewModel의 목록이 실제로 null입니다. (2)

내 첫 번째 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은보기로 전달 될 때 잘 채워집니다. 그러나 제출 단추를 클릭하면 게시물을 처리하는 컨트롤러 동작에는 viewmodel의 Name 속성에 대한 값만 있습니다. Notes 속성 - 사용자가 확인 / 선택 취소 한 메모 목록 -은 null입니다. 뷰가 표시되고 ViewModel이 다시 전송 될 때 해당 TextBoxFor 및 CheckBoxFor 요소 채우기 사이에 연결이 끊어졌습니다. 이것에 대한 안내?

해결책 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에 다시 전달할 방법이 없습니다. 모델 바인딩의

그래서 나는 좋은 것을 배웠습니다.


그리고 대답을 for 루프로 원한다면 :

@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)
}

당신은 현명한 사람입니다. 그래서 당신의 견해를보십시오. 그런 다음 HTML이 생성되는 방법을 고려하십시오. 그런 다음 생성 된 HTML을 기반으로 Notes를 다시 채우기 위해 Model Binder가 알고 있어야하는 포스트 백이 어떤지 고려하십시오.

Model Binder가 알아낼 수있는 충분한 정보가 HTML에 없다는 것을 알게 될 것입니다.

이걸 고려하세요:

@EditorFor(m => Model.Notes)

for 루프는 기본적으로 EditorFor 함수에서 컨텍스트를 숨기고있는 곳입니다.





asp.net-mvc-3