在ASP.NET MVC POST中绑定IEnumerable的模型?

时间:2012-01-12 09:43:11

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

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

我的模型中的某些属性未绑定到操作的帖子。似乎模型上的属性就像字符串一样好,但我的IEnumerable是没有绑定的。

以下是我的代码片段:

<%: 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; }

视图工作正常,并输出一个文本框列表,其中包含预期值。但是被解雇的帖子只会将Test字符串识别为属性。模型状态也不包含我的IEnumerable数据。

2 个答案:

答案 0 :(得分:8)

模型绑定取决于生成的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%>

和休息将由框架本身处理

答案 1 :(得分:0)

IEnumarble类型可以正常使用  我认为问题是你在ToArray循环中写的For。 (这也非常有效)
for循环更改为foreach

请参阅this如何实现它的优秀答案。