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数据。

ASP.NET MVC POST中的模型绑定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_。

看看这个优秀的答案如何实现它。