ASP NET MVC 4集合在post上为null

我读了大部分谷歌:-),但我无法继续。 我的对象上的集合是并且在post上保持为null,无论我做什么。

我的型号:

public class ArticleViewModel { public Guid EventId { get; set; } public IList ArtikelListe { get; set; } public decimal GesamtpreisNetto { get; set; } public decimal MwSt { get; set; } } 

 public class ArticleItemViewModel { public Guid EventId { get; set; } public Guid Id { get; set; } public string Artikelname { get; set; } public string Artikelname_EN { get; set; } public string Information { get; set; } public string Information_EN { get; set; } public decimal Preis { get; set; } public bool MitAnzahl { get; set; } public bool IstKategorie { get; set; } public int Anzahl { get; set; } public bool Checkbox { get; set; } public int Reihenfolge { get; set; } } 

我的看法:

 @using (Html.BeginForm("Next", "Article", FormMethod.Post)) { @Html.HiddenFor(x => x.EventId)  for (var i = 0; i < Model.ArtikelListe.Count; i++) // foreach (EventManager.ViewModels.ArticleItemViewModel artikelItem in Model.ArtikelListe) { 
@if (Model.ArtikelListe[i].IstKategorie) { @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)
@Html.LabelFor(x => x.ArtikelListe[i].Information) } else { if (Model.ArtikelListe[i].MitAnzahl) { @Html.TextBoxFor(x => x.ArtikelListe[i].Anzahl, new { @class = "field text fn" }) } else { @Html.LabelFor(x => x.ArtikelListe[i].Anzahl) } @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)
@Html.LabelFor(x => x.ArtikelListe[i].Information) }
}

在post上,我得到了我的Viewmodel,它有一个ArtikelListe的集合,有15个项目(这是正确的),但这些都是空的!

在我的HTTP标头中,我得到以下post数据:

 EventId:824e7f3c-7190-4ebb-aa60-51b57c977b1e ArtikelListe: ArtikelListe[1].Anzahl:0 ArtikelListe[2].Anzahl:1 ArtikelListe[3].Anzahl:0 submitButton:Nächste 

我想知道为什么只有部分数据与httppost一起发送,以及为什么我的所有列表项都为空。 我试图通过for和foreach来渲染。 同样的结果。

有任何想法吗? 我很无奈。

集合索引器必须从零开始并且是连续的(除非您包含Index属性)。由于您的if语句,您不一定为属性Anzahl生成控件。 查看标题信息,您没有ArtikelListe[0].Anzahl的值,这意味着第一项必须具有IstKategorie=trueMitAnzahl=false 。 您可以通过添加隐藏输入来更正此值,以便回发值

 @if (Model.ArtikelListe[i].IstKategorie) { @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)
@Html.LabelFor(x => x.ArtikelListe[i].Information) @Html.HiddenFor(x => x.ArtikelListe[i].Anzahl) // add this } else { if (Model.ArtikelListe[i].MitAnzahl) { @Html.TextBoxFor(x => x.ArtikelListe[i].Anzahl, new { @class = "field text fn" }) } else { @Html.LabelFor(x => x.ArtikelListe[i].Anzahl) @Html.HiddenFor(x => x.ArtikelListe[i].Anzahl) // add this } @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)
@Html.LabelFor(x => x.ArtikelListe[i].Information) }

或者,您可以添加一个Index属性, DefaultModelBinder使用该属性来匹配非连续的集合项

 @if (Model.ArtikelListe[i].IstKategorie) { @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)
@Html.LabelFor(x => x.ArtikelListe[i].Information) } else { if (Model.ArtikelListe[i].MitAnzahl) { @Html.TextBoxFor(x => x.ArtikelListe[i].Anzahl, new { @class = "field text fn" }) // add this manually } else { @Html.LabelFor(x => x.ArtikelListe[i].Anzahl) } @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)
@Html.LabelFor(x => x.ArtikelListe[i].Information) }

使用第一个选项,它将回发所有项目。 在第二种情况下,它将仅回发符合if条件的项目。

请注意,谢尔盖指出,您还需要删除

这一行的问题:

  

发送POST请求时:

 ArtikelListe: ArtikelListe[1].Anzahl:0 ArtikelListe[2].Anzahl:1 ArtikelListe[3].Anzahl:0 

然后ArtikelListe覆盖列表的值,这就是为什么它始终为null。 因此,您只需将隐藏字段重命名为其他名称,即可与现有名称冲突。

这是基于您在DotNetFiddle中的MVC代码的工作示例 – https://dotnetfiddle.net/BCXduq

您可以单击“运行”,然后在右下方框的两个输入字段中输入一些值,然后单击“保存”按钮。 然后它将显示服务器在POST中收到的模型作为JSON文本。

感谢你们。

问题是,我用小提琴的剧本进行了测试。 在这段代码中

 Model.ArtikelListe[i].MitAnzahl 

总是如此。

如果不成立,则值“Anzahl”未绑定到包含值(但只是标签)的控件。

 @Html.LabelFor(x => x.ArtikelListe[i].Anzahl) 

只要我在该范围内插入一个隐藏字段并将“Anzahl”值绑定到它,就会返回包含我所期望的所有数据的post。

不管怎么说,还是要谢谢你。 我学到了很多!