【问题标题】:Modelbinding IEnumerable in ASP.NET MVC POST?ASP.NET MVC POST中的模型绑定IEnumerable?
【发布时间】:2012-01-12 09:43:11
【问题描述】:

将 IEnumerable 类型模型绑定到 MVC POST 是否存在任何问题?

我的模型中的某些属性未绑定到操作的帖子上。似乎模型上的属性(如字符串)没问题,但我的 IEnumerable 没有被绑定。

这是我的代码的 sn-p:

<%: Html.TextBoxFor(m => m.ResponseInfo.SubsetInfo.Test) %>
    <% for (int i = 0; i < Model.ResponseInfo.SubsetInfo.BandAvailabilities.Count(); i++)
    {%>
        <%: Html.TextBoxFor(m => m.ResponseInfo.SubsetInfo.BandAvailabilities.ToArray()[i].BandName) %>
  <% } %>

下面是这些属性在模型中的样子:

public IEnumerable<BandAvailabilityInfo> BandAvailabilities { get; set; }
public string Test { get; set; }

视图工作正常,并输出包含预期值的文本框列表。但是被触发的 post Action 仅将 Test 字符串识别为属性。模型状态也不包含我的 IEnumerable 数据。

【问题讨论】:

  • 尽管被否决了,但我真的希望有类似问题的人偶然发现这个问题并更好地了解问题......
  • 我不确定..为什么许多好的问题在没有解释的情况下被否决了....我偶然发现了这一点并发现它很有用。谢谢。

标签: c# asp.net-mvc ienumerable model-binding


【解决方案1】:

模型绑定取决于生成的 html 的外观。为您的特定场景正确绑定 html 应该是这样的

<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[0].BandName"/>
<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[1].BandName"/>
<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[2].BandName"/>
.
.
<input type="text" name = "ResponseInfo.SubsetInfo.BandAvailabilities[n].BandName"/>

我还没有尝试过,但我几乎可以肯定,在循环中调用 ToArray 方法会阻止系统为嵌套输入生成正确的名称。您可以采取一些措施来解决此问题 首先,在你的视图模型中改变

public IEnumerable<BandAvailabilityInfo> BandAvailabilities { get; set; }

public IList<BandAvailabilityInfo> BandAvailabilities { get; set; }  //or Array

因此您不必在循环中调用 ToArray 方法,并且会为输入生成正确的名称。 其次,制作一个编辑器模板并将其放入当前控制器下的编辑器模板文件夹或共享文件夹的编辑器模板文件夹中。使此视图接受BandAvailabilityInfo 类型的模型,并且此视图的名称也应为BandAvailabilityInfo。然后在您的主视图中,您只需将整个循环替换为

 <%: Html.EditorFor(m => m.ResponseInfo.SubsetInfo.BandAvailabilities%>

其余的将由框架自己处理

【讨论】:

  • 我不确定这是否是事实,因为我使用了 ToArray,但将其更改为实际数组可以解决问题。
  • 你可以检查生成的html并确保它
【解决方案2】:

它适用于 IEnumarble 类型。
我认为问题在于您在For 循环中编写的ToArray。 (这也不是很有效)
for 循环更改为foreach

查看this优秀答案如何实现。

【讨论】:

  • 我使用了一个 for 循环,因为我需要制作 TextBoxFors,它采用 Model 的谓词参数来识别我正在为我的模型中的集合的哪个元素制作这个 TextBoxFor。索引只是跟踪这些元素的一种方式。使用 foreach 循环,我失去了元素来自何处的上下文。据我所知,这种方式相比之下并不是低效的,特别是如果我使用数组,因为速度是 O(1)。
猜你喜欢
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2010-09-21
  • 2011-03-15
  • 2013-05-27
  • 2011-01-06
相关资源
最近更新 更多