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

时间:2016-04-04 23:16:44

标签: c# asp.net-core asp.net-core-mvc model-binding

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

我正在使用正确的索引创建输入html元素:

这是POST的HTML表单:

@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个索引。

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

型号:

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

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

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

  

对象引用未设置为对象的实例。

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

1 个答案:

答案 0 :(得分:6)

使用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)。