复杂的模型绑定

时间:2009-08-13 05:40:22

标签: asp.net-mvc

我有一个包含一堆字段的客户端dto,还包含一个List。

现在,我可以很容易地绑定它,它将显示客户端的所有地址。问题是用户可以动态删除和添加地址。

我考虑过在每个地址周围添加表单,但后来我最终得到了内部表单,我知道浏览器不能很好地使用它。

然后我考虑使用javascript但是如果地址被删除,我必须遍历所有地址并更改它们的索引(地址[0] .City)因为我注意到如果索引不按顺序,并且动作将ClientForm作为参数,然后只有具有连续索引且从0开始的地址 - 将进入ClientForm.Addresses列表。

其他易于实施的解决方案?我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

如果您在每个地址上放置一个具有不同名称但没有表单标签的提交按钮,则您的外部表单可以检查是否存在特定按钮并重定向到正确的操作(例如,编辑地址编号1,删除地址3等)

如果您正在使用jquery验证,则需要注意的是,所有“子”提交按钮的类型必须设置为“取消”,因此在按下它们时不会发生验证。

HTH,

答案 1 :(得分:1)

对于页面上的每个地址,提供一个名为addresses.Index的隐藏表单字段,这将采用整数值。 ASP.NET MVC模型绑定器(在版本2及更高版本中)将接收addresses.Index表单字段的多个值,并使用整数值来确定哪些addresses[index].property字段值在逻辑上属于一起。

E.g。

addresses.Index = 0
addresses.Index = 3

会提示模型绑定器去寻找......

addresses[0].City
addresses[0].Street
addresses[3].City
addresses[3].Street

...并使用两个元素在控制器操作中填充ICollection<Address>

当然,如果你可以删除并在你的页面上插入这些记录,你的Javascript将需要跟踪在全局变量中使用的下一个索引,以避免为多行重用相同的索引(即不只是依赖于包含地址元素的表的长度等。

此解决方案由Phil Haack here.

进一步详细描述