asp.net mvc 6 模型绑定到复杂集合 - IList<T>

asp.net mvc 6 model binding to complex collection - IList<T>

我正在尝试在 asp.net mvc 6 中执行 post 操作,并希望正确初始化复杂的 属性 集合。但它总是空的。

我正在创建具有正确索引的输入 html 元素:

这是 HTML 表格 POST:

@model MainObject
<form asp-action="create" method="post">
  <input asp-for="ChildObjects[0].RollNumber" />
  <input type="submit" value="create" />
</form>

控制器代码

public async Task<IActionResult> Create(MainObject mainObj)
{
    // The mainObj.ChildObjects remains empty.
}

我的视图将只包含一个子对象条目,这就是为什么只使用 0 个索引。

表单数据包含上述键和值,但当它到达控制器操作时,集合 属性 为空,即 MainObject.ChildObjects 的计数为 0。(注意:ChildObjects 列表已在中初始化我的 MainObject 构造函数)

型号:

public class MainObject {
   public MainObject() {
      this.ChildObjects = new List<ChildObjects>();
   }

   public IList<ChildObject> ChildObjects {get; private set;}
}

在调试模式下的构造函数中查找 ModelState 属性 时,它显示一个 ChildObjects 键错误,但错误消息过于笼统:

Object reference not set to instance of an object.

我在网上关注了很多关于模型绑定复杂集合的文章,但不知何故它对我不起作用。

使用 private set 声明子对象集合会阻止活页夹设置集合值。 setter 必须是 public 以便 MVC6 可以在回传中设置值;

public IList<ChildObject> ChildObjects {get; private set;} // empty on postback
public IList<ChildObject> ChildObjects {get; set;} // populated on postback

但是当模型绑定器调用您声明的无参数构造函数时,集合仍然被实例化(而不是 null,因此 count == 0)。