将 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; }
该视图工作正常,并输出一个文本框列表,其中包含预期值。但是被触发的后操作仅将测试字符串识别为属性。模型状态也不包含我的 IEnumerable 数据。
模型绑定取决于生成的 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%>
其余的将由框架本身处理
它与
IEnumarble
类型配合得很好。ToArray
循环中编写的 For
。 (效率也很低)for
循环更改为 foreach
。
请参阅this出色的答案如何实现它。