私の問題を明確に説明している StackOverflow に関するいくつかの質問を見つけましたが、私の場合、修正を機能させることができません。この問題でこの 2 日間、私は忙しくしていたので、ここに私の質問があります。
プロパティとメソッドを含む ViewModel がいくつかあります (メソッドは UI インタラクション ロジック専用です)。フォームを投稿すると、モデルの 1 つのオブジェクト プロパティのみがバインドされ、2 番目のオブジェクト プロパティのすべてのプロパティが null になります。理由がわかりません。
これが私のViewModelのコードです:
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);
}
}
}
これが私の見解のコードです:
@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" />
}
ここに私のコントローラのプロトタイプがあります:
[HttpPost]
public ActionResult Circuit(ViewModels.Models.Booking.Circuit etapePrecedente)
タイプ Voyageurs のプロパティがコントローラーに送信されるため、デバッグ時にそのすべてのフィールドが入力されていることがわかります。ただし、CircuitInput 型のプロパティのメンバーはすべて null です。すべてのプロパティに隠しフィールドを設定したため、その理由がわかりません。
複数ステップのフォームがあり、セッション状態を使用したくないため、この複雑な ViewModel でこのパターンを使用します。Model Binder を誤解させる ViewModel に問題があるかどうか教えてください。
編集 ViewModel を理解するのに役立つことの 1 つは、List オブジェクトを使用して事前に保存するため、ユーザーがデータを入力してインスタンスを追加し、最後にデータベース コードを呼び出して消費量を減らすことだけです。
ありがとう!