将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数据。
答案 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如何实现它的优秀答案。