请考虑以下事项:
表格
<form method="post">
<input name="As[].Id1" />
<input name="As[].Id2" />
<input name="Ids[]" />
</form>
表单数据
As[].Id1=0&As[].Id2=1&As[].Id1=2&As[].Id2=3&Ids[]=4&Ids[]=5
模型
public class A {
public int Id1 { get; set; }
public int Id2 { get; set; }
}
public class B {
public IEnumerable<A> As { get; set; }
public IEnumerable<int> Ids { get; set; }
}
行动方法
[HttpPost]
public ActionResult C(
B b) {...}
在上面的示例中,我希望有B
的实例,其As
属性包含两个对象:{ Id1=0, Id2=1}
和{ Id1=2, Id2=3 }
;它的Ids
属性包含两个整数:4,5
。实际上,我得到B
的实例,其As
属性为null
,其Ids
属性包含两个整数:{{1 }}
因此,当表单数据没有集合的索引时,绑定器似乎很难映射复杂对象的集合属性。如果它有一个索引,从4,5
开始,它会按预期绑定。
我的问题是我的表单不能有索引,因为可放置字段的数量可以在任何给定点发生变化,这就是为什么我要使用无索引的集合,这对于简单属性很有用。 / p>
我是否有某种方法可以让活页夹无法工作1)在提交前使用JavaScript对表单进行规范化以编辑所有字段名称并为其提供索引或2)为类{{编写自定义绑定器1}?我想避免JavaScript路由,因为我不相信它,并且通过简单地尝试自定义绑定器路由,看起来开始工作会很痛苦。
答案 0 :(得分:1)
除了使用javascript设置集合索引器或创建自定义模型绑定器之外,第三个选项是包含集合<=
属性的隐藏输入,允许您匹配非零,非连续索引。索引器的值可以是您想要的任何值(例如,数字,.Index
或Guid
),以便您的名称/值对看起来像
string
有关模型绑定到集合的更多信息,请参阅Model Binding To A List