2013-05-13 2 views
4

그래서 여러 개의 다른 객체와 객체 목록을 전달해야하고 뷰 모델을 생성해야한다는 견해가 있습니다. 내 뷰 모델이MVC 4 model 돌아오다

public class EditUserViewModel 
{ 
    public ManageUsersViewModel ManageUsersViewModel { get; set; } 
    public IEnumerable<StateModel> StateModel { get; set; } 
} 

나는이

public class StateModel 
{ 
    public bool IsChecked { get; set; } 
    public States States { get; set; } 
    public UsersInStates UsersInStates { get; set; } 
} 

처럼 보이는 StateModel입니다에 문제가 부분처럼 보이는 난 내보기에서이

[Table("States")] 
public class States 
{ 
    [Key] 
    public int StateId { get; set; } 
    public string State { get; set; } 
} 

[Table("UsersInStates")] 
public class UsersInStates 
{ 
    [Key, Column(Order = 1)] 
    public int UserId { get; set; } 
    [Key, Column(Order = 2)] 
    public int StateId { get; set; } 
    public string LicenseNumber { get; set; } 
} 

을 포함 어느 정도 상태를 반복하고 UsersInStates에 대한 사용자 입력을 시도합니다. 이것이 내가 그것을 성취하려는 방법이지만, 전체 StateModel은 null로 돌아옵니다. StateModel.States에 데이터가 있고 UsersInStates가보기에 들어 가지 않습니다. 이것은 내보기에 보이는 것입니다.

@foreach (var state in Model.StateModel) 
{ 
    @Html.HiddenFor(m => state) 
    <tr> 
     <td> 
      @Html.CheckBoxFor(m => state.IsChecked) 
     </td> 
     <td> 
      @Html.Label(state.States.State) 
     </td> 
     <td> 
      @Html.EditorFor(m => state.UsersInStates.LicenseNumber) 
     </td> 
    </tr> 
} 

조언을 주시면 감사하겠습니다. 모든 것이 표시되고 ManageUsersViewModel 파트가 제대로 작동합니다. 컨트롤러에 다시 들어오는 StateModel 데이터가 null이고이 작업을 원하는 방식으로 수행하는 방법을 정확히 모르겠습니다.

좋아 내가 루프에 대한 사용이 문제를 해결하기 위해 :

은 생성 된 HTML 테이블의 시작과

<table style="margin-left:auto; margin-right:auto; text-align:center"> 
<input id="state" name="state" type="hidden" value="WebSiteNew.Models.StateModel" />     <tr> 
       <td> 
        <input data-val="true" data-val-required="The IsChecked field is  required." id="state_IsChecked" name="state.IsChecked" type="checkbox" value="true" /> <input name="state.IsChecked" type="hidden" value="false" /> 
       </td> 
       <td> 
        <label for="Alabama">Alabama</label> 
       </td> 
       <td> 
        <input class="text-box single-line" id="state_UsersInStates_LicenseNumber" name="state.UsersInStates.LicenseNumber" type="text" value="" /> 
       </td> 
      </tr> 

대답의 요청에 따라 첫 번째 행에 대한 모습입니다 아래의 답변에 나열된 두 참조에 설명되어 있습니다

@for (int i = 0; i < Model.StateModel.Count(); i++) 
{ 
    <tr> 
     <td> 
      @Html.HiddenFor(m => m.StateModel[i].States.StateId) 
      @Html.HiddenFor(m => m.StateModel[i].States.State) 
      @Html.CheckBoxFor(m => m.StateModel[i].IsChecked) 
     </td> 
     <td> 
      @Html.Label(Model.StateModel[i].States.State) 
     </td> 
     <td> 
      @Html.EditorFor(m => m.StateModel[i].UsersInStates.LicenseNumber) 
     </td> 
    </tr> 
} 

또한이 주저하는 사람에게 보내는 메모는 IEnu 내 EditUsersViewModel에서 IList로 색인 생성이 가능합니다.

+0

생성 된 HTML이 어떻게 생겼는지 보여줄 수 있습니까? – CorrugatedAir

+0

예 내 게시물을 업데이트했습니다. – aw04

+0

포스트 백 컨트롤러 메서드를 추가하십시오. –

답변

6

문제는 모델 바인딩이 올바르게 발생하지 않는다는 것입니다. 이름 필드가 어떻게 구성되어 있는지

<input name="Name" value="(Not relevant to this example)"/> 
<input name="Child.ChildName" value="(Not relevant to this example)" /> 

참고 : 다음과 같이 할 필요가

public class ParentModel 
{ 
    public string Name {get;set;} 
    public ChildModel Child {get;set;} 
} 

public class ChildModel 
{ 
    public string ChildName {get;set;} 
    public int SomeNumber {get;set;} 
} 

생성 된 HTML (제대로 일어날 결합 모델의 경우) :

는이 두 모델을 말해봐 - MVC가 어떤 입력 값이 뷰 모델의 어떤 속성에 매핑되는지를 결정하는 방법입니다. 중첩 된 속성의 경우 속성 이름이 앞에 와야합니다.

컬렉션을 사용하면 더욱 복잡해집니다. 모델 바인더는 어느 값이 어떤 속성 인스턴스와 연관되는지를 알아야합니다.

<input name="Name" value="(Not relevant to this example)"/> 
<input name="Child[0].ChildName" value="(Not relevant to this example)" /> 
<input name="Child[0].SomeNumber" value="(Not relevant to this example)"/> 
<input name="Child[1].ChildName" value="(Not relevant to this example)" /> 
<input name="Child[1].SomeNumber" value="(Not relevant to this example)"/> 

방법이에 대해 다음에서보세요 : 우리는 ChildModel 유형의 이전 예제를 IEnumerable 가정하면

예를 들어, 당신의 HTML 제대로 바인딩을 모델링하기 위해 다음과 같이 보일 수 있습니다 그것을 해결 :

http://seesharpdeveloper.blogspot.com/2012/05/mvc-model-binding-to-list-of-complex.html http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

편집을 - 그것은주의하는 것도 중요 그 때 HTML을 도우미 g 이름 값을 enerate,이 전달 된 람다 값을 기반으로. 그래서

@Html.CheckBoxFor(m => state.IsChecked) 

는 다음과 같은 이름이 foreach는 내 것 때문에

name="state.IsChecked" 

를 생성합니다, 당신은 잘못을 받고있어 이름의 값.

+0

위대한 설명, 고마워요. 그것으로 지금보십시오. – aw04

1

렌더링 된 HTML에서 @Html.HiddenFor(m => state)으로 무엇을 달성하려고합니까? 그 원인은 바로 그 범인과 같습니다. @Html.HiddenFor(m => state.StateId)이 더 적절할까요?

또한 첫 번째 <td> 요소에 숨길 수 있습니다.이 요소는 숨겨져 있으며 HTML을 유효하게 유지합니다.

+0

좋은 지점이 있습니다. 내 자신의 명명 규칙을 혼란스럽게 생각합니다. @Html.HiddenFor (m => state.States) 또는 @Html이어야합니다. HiddenFor (m => state.States.State) 및 @ Html.HiddenFor (m => state.States.StateId)입니다. 이것은 문제가 아니지만 여전히 null 값을 얻습니다. – aw04