C# ASP NET MVC 4集合在post上为空
我读了谷歌的大部分内容:-,但我无法继续。无论我做什么,我的对象上的集合都是空的,并且在post上保持为空 我的模型:C# ASP NET MVC 4集合在post上为空,c#,asp.net,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc 4,我读了谷歌的大部分内容:-,但我无法继续。无论我做什么,我的对象上的集合都是空的,并且在post上保持为空 我的模型: public class ArticleViewModel { public Guid EventId { get; set; } public IList<ArticleItemViewModel> ArtikelListe { get; set; } public decimal GesamtpreisNetto { get; set;
public class ArticleViewModel
{
public Guid EventId { get; set; }
public IList<ArticleItemViewModel> ArtikelListe { get; set; }
public decimal GesamtpreisNetto { get; set; }
public decimal MwSt { 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>
}
我想知道为什么http post上只发送部分数据,为什么我的所有列表项都为空。我试着为每一个人做一次渲染。同样的结果
有什么想法吗?我很无助。这一行的问题是:
<input type="hidden" name="ArtikelListe" />
然后ArtikelListe覆盖列表的值,这就是它始终为空的原因。
因此,您只需要将隐藏字段重命名为其他名称,以避免与现有名称冲突
下面是一个基于DotNetFiddle中MVC代码的工作示例-
您可以单击“运行”,然后在右下框的两个输入字段中输入一些值,然后单击“保存”按钮。然后,它会将服务器在POST中收到的模型显示为JSON文本。集合索引器必须从零开始,并且必须连续,除非您包含索引属性。由于您的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)
}
使用第一个选项,它将发回所有项目。在第二种情况下,它将只回发满足if条件的项目
请注意,正如Sergey所说,您还需要删除谢谢大家
问题是,我用小提琴上的脚本做了测试。在此代码中
Model.ArtikelListe[i].MitAnzahl
这一直都是真的
如果不正确,则值Anzahl未绑定到包含值的控件,而只是一个标签
@Html.LabelFor(x => x.ArtikelListe[i].Anzahl)
当我在该范围内插入一个隐藏字段并将Anzahl值绑定到它时,post返回了我所期望的所有数据
无论如何,谢谢你。我学到了很多 谢谢大家!如果我删除,则整个集合在post上为空。我现在将检查您的代码。如果我删除或重命名隐藏的字段名。这就是我想说的:-你的代码运行良好。但我的代码中仍然有一个空集合。你还改变了什么?我就是不能得到它…检查我指定的DotNetFiddle链接。它在那个里工作,Anzahl参数对服务器端来说很好,集合有两个和UI上相同的项。也许你有不同的代码影响它?哇。我给你一个详细正确的答案,而不是接受它,你张贴这个。甚至连赞成票都没有。祝你以后能得到任何帮助。斯蒂芬,对不起我的错。很久没有了,所以我不知道我是否错过了你的答案,或者只是不知道更好的答案。下次请在拍摄前询问。谢谢
@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)
}
@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)
}
Model.ArtikelListe[i].MitAnzahl
@Html.LabelFor(x => x.ArtikelListe[i].Anzahl)