내 문제를 명확하게 설명한 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에서 문제가 발생했는지 알려주세요.
편집 내 뷰 모델을 이해하는 데 도움이 될 수있는 한 가지 : 내가 미리 저장을 위해 목록 객체를 사용하는 사용자는 웁니다 때문에, 인스턴스를 추가, 나는 매우 소비 엔드에 내 데이터베이스 코드를 호출 적게.
감사합니다.
왜''CircuitInput' 내에서 중첩 클래스를 CircuitInfos'되어 잊었 때 문제에 대한 비슷한 가진 기억 나? 자체 클래스로 이동하면 문제가 해결됩니까? – levelnis
이것은 논리적 목적을 위해서만 중첩 된 클래스이며, 사용자로부터 입력을 검색하는 데 사용하는 클래스입니다. 클래스에 표시 할 속성과 사용자 입력에서 검색 할 속성이 둘 다있을 때마다 중첩 클래스를 만듭니다. – user2948152