【问题标题】:Model.List is null on POST using RazorModel.List 在使用 Razor 的 POST 上为空
【发布时间】:2014-08-07 03:11:54
【问题描述】:

我的看法:

@foreach(var item in Model.List)
{
  @Html.HiddenFor(model => item.UserId)
  @Html.HiddenFor(model => item.Name)
  @Html.HiddenFor(model => item.Age)

  @Html.CheckBoxFor(model => item.IsChecked, new { id = item.UserId })
  <label>@item.Name</label>
}

我的控制器:

[HttpPost]
public ActionResult Create(MyModel Model)
{
..

Model.List 为空?

列表在GET 上填充正常。但是,在 POST(这个特定的 View 是一个表单)上,Model.List 为空。我尝试过使用HiddenFor 助手,但还没有成功。

感谢任何建议/答案。谢谢。

【问题讨论】:

  • 你能显示你的控制器代码吗
  • 向我们展示您在控制器中的代码
  • 我已经更新了我的帖子。我只展示了一个片段,因为(我认为)其余代码无关紧要?如果我错了,请纠正我。

标签: c# asp.net-mvc


【解决方案1】:

您需要使用for 循环而不是foreach 循环才能使数据绑定与集合正常工作。

因此,不要执行 foreach 循环,而是将代码更改为以下内容:

@for (var i = 0; i < Model.List.Count(); i++)
{
  @Html.HiddenFor(model => Model.List[i].UserId)
  @Html.HiddenFor(model => Model.List[i].Name)
  @Html.HiddenFor(model => Model.List[i].Age)

  @Html.CheckBoxFor(model => Model.List[i].IsChecked, new { id = Model.List[i].UserId })
  <label>@Model.List[i].Name</label>
}

这使 ModelBinder 能够跟踪您尝试绑定的集合中项目的索引。

如果您在完成此操作后查看生成的 HTML,您会注意到生成的输入控件看起来像这样:

<input type="hidden" name="List[0].IsChecked" />

这使模型绑定器能够知道它绑定到列表中的哪个项目。

【讨论】:

  • 谢谢。很好的解释。
  • 也只是想说声谢谢。顺便说一句,我还有一个后续问题。你是否有办法实现这一点,但不是将表单输入直接嵌套在 for 循环中,而是传递一个接收 List 对象模型的局部视图。我一直在寻找解决方案,但似乎找不到。
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2021-05-24
  • 2017-12-01
  • 2022-11-11
  • 2014-01-22
  • 1970-01-01
相关资源
最近更新 更多