在ASP.NET MVC POST中绑定IEnumerable的模型?

Ark*_*nam 10 c# asp.net-mvc ienumerable model-binding

将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) %>
  <% } %>
Run Code Online (Sandbox Code Playgroud)

以下是这些属性在模型中的样子:

public IEnumerable<BandAvailabilityInfo> BandAvailabilities { get; set; }
public string Test { get; set; }
Run Code Online (Sandbox Code Playgroud)

视图工作正常,并输出一个文本框列表,其中包含预期值.但是被解雇的帖子只会将Test字符串识别为属性.模型状态也不包含我的IEnumerable数据.

Muh*_*hid 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"/>
Run Code Online (Sandbox Code Playgroud)

我还没有尝试过,但我几乎可以肯定,在循环中调用ToArray方法会阻止系统为嵌套输入生成正确的名称.您可以采取一些措施来解决这个问题首先,在您的视图模型更改中

public IEnumerable<BandAvailabilityInfo> BandAvailabilities { get; set; }
Run Code Online (Sandbox Code Playgroud)

public IList<BandAvailabilityInfo> BandAvailabilities { get; set; }  //or Array
Run Code Online (Sandbox Code Playgroud)

因此,您不必在循环中调用ToArray方法,并为输入生成专有名称.其次,制作一个编辑器模板并将其放在编辑器模板文件夹中,位于当前控制器下或共享文件夹的编辑器模板文件夹中.使此视图接受此视图的类型BandAvailabilityInfo和名称的模型也应该是BandAvailabilityInfo.然后在你的主视图中你只需要替换整个循环

 <%: Html.EditorFor(m => m.ResponseInfo.SubsetInfo.BandAvailabilities%>
Run Code Online (Sandbox Code Playgroud)

和休息将由框架本身处理