C# · 12月 30, 2021

c# – ASP.NET MVC POST中的Modelbinding IEnumerable?

将模型绑定IEnumerable类型与MVC POST有任何问题吗?

我的模型中的一些属性没有被绑定到一个动作的帖子.似乎模型上的属性就像字符串一样,但我的IEnumerable是什么没有绑定.

以下是我的代码片段:

<%: Html.Text@R_700_2419@For(m => m.ResponseInfo.SubsetInfo.Test) %> <% for (int i = 0; i < Model.ResponseInfo.SubsetInfo.BandAvailabilities.Count(); i++) {%> <%: Html.Text@R_700_2419@For(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%>

休息将由框架本身处理