当从视图绑定到控制器时,MVC4复杂对象为空。

问题描述 投票:1回答:1

我在StackOverflow上找到了几个问题,清楚地描述了我的问题,但我无法在我的情况下得到修复。这个问题让我忙了两天,所以我的问题是这样的。

我有几个ViewModels,包含了属性和方法(方法只用于UI交互逻辑)。当我发布表单的时候,我的模型只有一个对象属性被绑定,第二个对象属性的所有属性都是空的,我找不到原因!

这是我的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类型的属性的所有成员都是空的,我不明白为什么,因为我为每个属性都设置了一个隐藏字段。

我对这个复杂的ViewModel使用这种模式是因为我有一个多步骤的表单,我不想使用会话状态。请告诉我,问题是否来自于我的ViewModel,它误导了Model Binder。

编辑 有一件事,可以帮助理解我的ViewModel。我使用列表对象来预存,这样用户就会填充,添加实例, 我只在最后调用我的数据库代码,以减少消耗。

谢谢!请问您是如何理解我的ViewModel的?

asp.net-mvc-4 null viewmodel model-binding
1个回答
3
投票

你能不能试试在infos中加入{get;set;}?

public CircuitInfos infos {get;set;}

我记得有类似你的问题,当时我忘记了那些

© www.soinside.com 2019 - 2024. All rights reserved.