2013-11-02 2 views
1

내 문제를 명확하게 설명한 StackOverflow에 대한 몇 가지 질문을 찾았지만 문제가 해결되지 않았습니다. 이 문제로 인해 지난 이틀 동안 바빴습니다. 여기 제 질문이 있습니다.보기에서 컨트롤러로 바인딩 할 때 MVC4 복잡한 객체가 null입니다.

두 개의 ViewModel에 속성 및 메서드가 포함되어 있습니다 (메서드는 UI 상호 작용 논리에만 해당). 양식을 게시 할 때 내 모델의 개체 속성 하나만 바인딩되고 두 번째 개체 속성의 속성은 모두 null입니다. 이유를 찾을 수 없습니다! 재산 그래서

[HttpPost] 
public ActionResult Circuit(ViewModels.Models.Booking.Circuit etapePrecedente) 

: 여기

@model ViewModels.Models.Booking.Circuit 

@using (Html.BeginForm("Circuit", "Bookings", FormMethod.Post)) 
{ 
@Html.Label("Date arrivée") <br />  
@Html.EditorFor(m => m.inputCircuit.infos.horaireArrivee) <br /> 
@Html.Label("Date de départ") <br />  
@Html.EditorFor(m => m.inputCircuit.infos.horaireDepart) <br /> 
@Html.Label("Pays") <br /> 
@Html.EditorFor(m => m.inputCircuit.infos.pays) <br />  
@Html.Label("Adresse 1") <br /> 
@Html.EditorFor(m => m.inputCircuit.infos.adresse1) <br /> 
@Html.Label("Adresse 2") <br /> 
@Html.EditorFor(m => m.inputCircuit.infos.adresse2) <br /> 
@Html.Label("Adresse 3") <br /> 
@Html.EditorFor(m => m.inputCircuit.infos.adresse3) <br /> 
@Html.Label("Ville") <br /> 
@Html.EditorFor(m => m.inputCircuit.infos.ville) <br /> 
@Html.Label("Code Postal") <br /> 
@Html.EditorFor(m => m.inputCircuit.infos.codePostal) <br /> 
@Html.Label("Visite") <br /> 
@Html.EditorFor(m => m.inputCircuit.infos.visite) <br /> 

for (int i = 0; i < Model.inputCircuit.infos.listeVisites.Count; i++) 
{ 
    @Html.HiddenFor(m => m.inputCircuit.infos.listeVisites[i]) 
} 


for (int i = 0; i < Model.inputCircuit.etapesCircuit.Count; i++) 
{ 
    @Html.HiddenFor(m => m.inputCircuit.etapesCircuit[i].adresse1) 
    @Html.HiddenFor(m => m.inputCircuit.etapesCircuit[i].adresse2) 
    @Html.HiddenFor(m => m.inputCircuit.etapesCircuit[i].adresse3) 
    @Html.HiddenFor(m => m.inputCircuit.etapesCircuit[i].codePostal) 
    @Html.HiddenFor(m => m.inputCircuit.etapesCircuit[i].horaireArrivee) 
    @Html.HiddenFor(m => m.inputCircuit.etapesCircuit[i].horaireDepart) 
    @Html.HiddenFor(m => m.inputCircuit.etapesCircuit[i].pays) 
    @Html.HiddenFor(m => m.inputCircuit.etapesCircuit[i].ville) 
    @Html.HiddenFor(m => m.inputCircuit.etapesCircuit[i].visite) 

    for (int j = 0; j < Model.inputCircuit.etapesCircuit[i].listeVisites.Count; j++) 
    { 
     @Html.HiddenFor(m => m.inputCircuit.etapesCircuit[i].listeVisites[j]) 
    } 
} 

//Hard to understand without the definition of the class Voyageurs but this part works fine ! 
//All the fields of Model.infosvoyageurs are binded without any problem 
@Html.HiddenFor(m => m.infosVoyageurs.input.nombreVoyageurs) 
@Html.HiddenFor(m => m.infosVoyageurs.input.placesParVehicule) 
for (int i = 0; i < Model.infosVoyageurs.input.listePlacesVehicules.Count; i++) 
{ 
    @Html.HiddenFor(m => m.infosVoyageurs.input.listePlacesVehicules[i].Selected) 
    @Html.HiddenFor(m => m.infosVoyageurs.input.listePlacesVehicules[i].Value) 
    @Html.HiddenFor(m => m.infosVoyageurs.input.listePlacesVehicules[i].Text) 
} 

<input type="submit" name="ajouterEtape" value="Ajouter une autre étape au circuit" /> 

} 

내 컨트롤러의 프로토 타입입니다 : 여기

여기
public class Circuit 
{ 
    public Voyageurs infosVoyageurs { get; set; } 
    public CircuitInput inputCircuit { get; set; } 

    public Circuit() 
    { 
     inputCircuit = new CircuitInput(); 
    } 

    public class CircuitInput 
    { 
     public CircuitInfos infos; 
     public List<CircuitInfos> etapesCircuit { get; set; } 

     public CircuitInput() 
     { 
      infos = new CircuitInfos(); 
      etapesCircuit = new List<CircuitInfos>(); 
     } 


     public class CircuitInfos 
     { 
      public DateTime horaireArrivee { get; set; } 
      public DateTime horaireDepart { get; set; } 
      public string pays { get; set; } 
      public string adresse1 { get; set; } 
      public string adresse2 { get; set; } 
      public string adresse3 { get; set; } 
      public string ville { get; set; } 
      public string codePostal { get; set; } 
      public string visite { get; set; } 
      public List<string> listeVisites { get; set; } 

      public CircuitInfos() 
      { 
       listeVisites = new List<string>(); 
       horaireArrivee = DateTime.Now.AddDays(4); 
       horaireDepart = DateTime.Now.AddDays(2); 
      } 
     } 
} 

내보기 코드 내 뷰 모델의 코드입니다 Voyageurs 유형의 컨트롤러가 컨트롤러로 전송되면 디버깅 할 때 모든 필드가 채워지는 것을 볼 수 있습니다. 그러나 CircuitInput 유형의 속성에는 모든 멤버가 null로되어 있으므로 모든 단일 속성에 대해 숨겨진 필드를 넣었으므로 그 이유를 알지 못합니다.

내가 복잡한 상태의 ViewModel과 함께이 패턴을 사용하는 이유는 세션 상태를 사용하고 싶지 않기 때문입니다. 모델 바인더를 오도하는 내 ViewModel에서 문제가 발생했는지 알려주세요.

편집 내 뷰 모델을 이해하는 데 도움이 될 수있는 한 가지 : 내가 미리 저장을 위해 목록 객체를 사용하는 사용자는 웁니다 때문에, 인스턴스를 추가, 나는 매우 소비 엔드에 내 데이터베이스 코드를 호출 적게.

감사합니다.

+0

왜''CircuitInput' 내에서 중첩 클래스를 CircuitInfos'되어 잊었 때 문제에 대한 비슷한 가진 기억 나? 자체 클래스로 이동하면 문제가 해결됩니까? – levelnis

+0

이것은 논리적 목적을 위해서만 중첩 된 클래스이며, 사용자로부터 입력을 검색하는 데 사용하는 클래스입니다. 클래스에 표시 할 속성과 사용자 입력에서 검색 할 속성이 둘 다있을 때마다 중첩 클래스를 만듭니다. – user2948152

답변

3

정보에 {get; set;}을 추가 할 수 있습니까?

public CircuitInfos infos {get;set;} 

나는 사람들은

+1

당신은 놀라워요 ............ 나는 그것을 내 하나님 보지 못했습니다. 2 일은 단지 이것을 위해 길을 잃었다. 고마워요! – user2948152

+0

친구를 도와 주니 기쁘다. – WannaCSharp

+2

동일한 문제가 발생하지만 getter 및 setters가 있지만 여전히 동일한 문제가 있습니다. –