簡體   English   中英

ASP NET MVC 4集合發布后為空

[英]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=trueMitAnzahl=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM