将模型绑定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; }
视图工作正常,并输出文本框列表中的预期值.但是被触发的帖子Action只能将Test字符串识别为属性.模型状态也不包含我的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方法,并为输入生成适当的名称.
其次,编辑一个编辑器模板,并将其放在Editor templates文件夹中,或者在当前控制器或共享文件夹的Editor模板文件夹中.使此视图接受BandAvailabilityInfo类型的模型,此视图的名称也应为BandAvailabilityInfo.那么在你的主视图中,你只需要替换整个循环
<%: Html.EditorFor(m => m.ResponseInfo.SubsetInfo.BandAvailabilities%>
休息将由框架本身处理