ASP.NET MVC POST中的模型绑定IEnumerable
本文关键字:模型 绑定 IEnumerable NET MVC POST ASP | 更新日期: 2023-09-27 18:20:16
将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; }
该视图运行良好,并输出一个包含预期值的文本框列表。但是被触发的post-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 template文件夹中。使此视图接受类型为BandAvailabilityInfo
的模型,并且此视图的名称也应为BandAvailabilityInfo
。然后在你的主视图中,你只需要用替换整个循环
<%: Html.EditorFor(m => m.ResponseInfo.SubsetInfo.BandAvailabilities%>
其余部分将由框架本身处理
它适用于IEnumarble
类型
我认为问题在于你在For
循环中编写的ToArray
。(效率也很低)
将CCD_ 6循环改变为CCD_。
看看这个优秀的答案如何实现它。