[英]ASP NET MVC 4 collection is null on post
我閱讀了Google的大部分文章:-),但無法繼續。 無論我做什么,我的對象上的集合現在都為null,並且在發布后保持為空。
我的模特:
public class ArticleViewModel
{
public Guid EventId { get; set; }
public IList<ArticleItemViewModel> 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)
<input type="hidden" name="ArtikelListe" />
for (var i = 0; i < Model.ArtikelListe.Count; i++)
// foreach (EventManager.ViewModels.ArticleItemViewModel artikelItem in Model.ArtikelListe)
{
<div>
<div>
@if (Model.ArtikelListe[i].IstKategorie)
{
@Html.LabelFor(x => x.ArtikelListe[i].Artikelname)<br />
@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)<br />
@Html.LabelFor(x => x.ArtikelListe[i].Information)
}
</div>
</div>
}
發布后,我得到了Viewmodel,它有一個ArtikelListe集合,其中包含15個項目(是正確的),但是這些全都為空!
在我的HTTP標頭中,獲得以下發布數據:
EventId:824e7f3c-7190-4ebb-aa60-51b57c977b1e
ArtikelListe:
ArtikelListe[1].Anzahl:0
ArtikelListe[2].Anzahl:1
ArtikelListe[3].Anzahl:0
submitButton:Nächste
我想知道為什么在http帖子中僅發送部分數據,為什么我的所有列表項都為空。 我試圖通過for和foreach進行渲染。 同樣的結果。
有任何想法嗎? 我很無奈。
此行中的問題:
<input type="hidden" name="ArtikelListe" />
當POST請求發回時:
ArtikelListe:
ArtikelListe[1].Anzahl:0
ArtikelListe[2].Anzahl:1
ArtikelListe[3].Anzahl:0
然后ArtikelListe
會覆蓋列表的值,這就是為什么它始終為null的原因。 因此,您只需要將隱藏字段重命名為其他名稱,就不會與現有名稱沖突。
這是基於DotNetFiddle你的MVC代碼工作的例子- https://dotnetfiddle.net/BCXduq
您可以單擊“運行”,然后在右底部框中的兩個輸入字段中輸入一些值,然后單擊“保存”按鈕。 然后它將顯示服務器在POST中以JSON文本形式接收的模型。
集合索引器必須從零開始並且是連續的(除非您包含Index
屬性)。由於if
語句,您不一定要為屬性Anzahl
生成控件。 查看您的標題信息,您沒有ArtikelListe[0].Anzahl
的值,這意味着第一項必須具有IstKategorie=true
或MitAnzahl=false
。 您可以通過添加隱藏的輸入來更正此問題,以便將值回傳
@if (Model.ArtikelListe[i].IstKategorie)
{
@Html.LabelFor(x => x.ArtikelListe[i].Artikelname)<br />
@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)<br />
@Html.LabelFor(x => x.ArtikelListe[i].Information)
}
或者,您可以添加一個Index
屬性, DefaultModelBinder
使用該屬性來匹配非連續的收集項
@if (Model.ArtikelListe[i].IstKategorie)
{
@Html.LabelFor(x => x.ArtikelListe[i].Artikelname)<br />
@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" })
<input type="hidden" name="x.ArtikelListe.Index" value="@i" /> // add this manually
}
else
{
@Html.LabelFor(x => x.ArtikelListe[i].Anzahl)
}
@Html.LabelFor(x => x.ArtikelListe[i].Artikelname)<br />
@Html.LabelFor(x => x.ArtikelListe[i].Information)
}
使用第一個選項,它將回發所有項目。 在第二種情況下,它將僅回發滿足if
條件的項目。
正如Sergey所指出的,您還需要刪除<input type="hidden" name="ArtikelListe" />
感謝大伙們。
問題是,我用Fiddle中的腳本進行了測試。 在這段代碼中
Model.ArtikelListe[i].MitAnzahl
一直都是真的。
如果不正確,則值“ Anzahl”未綁定到包含值的控件(而只是一個標簽)。
@Html.LabelFor(x => x.ArtikelListe[i].Anzahl)
一旦我在該范圍內插入了一個隱藏字段並將其綁定“ Anzahl”值,該帖子就會返回所有我期望的數據。
不管怎么說,還是要謝謝你。 我學到了很多!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.