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=true
或MitAnzahl=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。
不管怎么说,还是要谢谢你。 我学到了很多!