如何在ASP.NET MVC(5)中绑定复杂对象集合属性而不在表单发布中使用索引?

时间:2017-04-20 23:40:09

标签: c# asp.net asp.net-mvc forms

请考虑以下事项:

表格

<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路由,因为我不相信它,并且通过简单地尝试自定义绑定器路由,看起来开始工作会很痛苦。

1 个答案:

答案 0 :(得分:1)

除了使用javascript设置集合索引器或创建自定义模型绑定器之外,第三个选项是包含集合<=属性的隐藏输入,允许您匹配非零,非连续索引。索引器的值可以是您想要的任何值(例如,数字,.IndexGuid),以便您的名称/值对看起来像

string

有关模型绑定到集合的更多信息,请参阅Model Binding To A List