Question

I've found several questions on StackOverflow which clearly describe my problem, but I'm unable to get the fixes working in my case. This problem kept me busy for the last two days, so here is my question.

I have a couple of ViewModels containing Properties and Methods (the methods are only for the UI interaction logic). When I post the form, only one object property of my model is bound, all the properties of the second object property are null, I can't find out why!

Here's the code of my 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);
            }
        }
}

Here is the code of my view:

@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" />

}

Here is the prototype of my controller :

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

So the property of type Voyageurs is sent to the controller, I can see all of its fields populated when debugging. However the property of type CircuitInput has all its members null, I don't understand why since I've put an hidden field for every single property.

I use this pattern with this complex ViewModel because I have a multistep form, I don't want to use Session State. Please tell me if the problem comes from my ViewModel which misleads the Model Binder.

Edit One thing that can be useful to understand my ViewModel: I use the List objects to pre-store, so the user populates, add instances, and I only call my database code at the very end to consume less.

Thanks!

Was it helpful?

Solution

Could you try adding {get;set;} to infos?

public CircuitInfos infos {get;set;}

I remember having something similar to your problem when I forgot those

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top