复杂模型绑定

3
我有一个Client dto,包含许多字段,还包括一个列表。
现在,我可以很容易地绑定它,它会显示带有所有地址的客户端。问题是用户可以动态地删除和添加地址。
我考虑添加每个地址周围的表单,但这样我就得到了内部表单,我知道浏览器对此并不兼容。
然后我想到使用javascript,但如果删除了一个地址,我必须遍历所有地址并更改它们的索引(addresses[0].City),因为我注意到如果索引不按顺序排列,并且操作以ClientForm作为参数,则仅具有连续索引并且从0开始的地址将进入ClientForm.Addresses列表中。
还有其他容易实现的解决方案吗?我错过了什么吗?
2个回答

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

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

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

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

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

此解决方案由Phil Haack进一步详细描述。


索引甚至不需要是整数,对吧?我只是使用像Id这样的唯一值,碰巧它是一个整数。这样我就不必在客户端上分配索引以确保它们保持唯一。 - Benjamin

1
如果您在每个地址上放置一个具有不同名称的提交按钮,但没有表单标签,则外部表单可以检查特定按钮的存在并重定向到正确的操作(例如编辑地址1,删除地址3等)。
如果您正在使用jQuery验证,则有一个警告是所有“子”提交按钮的类型必须设置为“取消”,以便在按下它们时不会发生验证。
希望对您有所帮助,

我不确定你所说的“你的外部表单可以检查存在性”的意思是什么,能否给一个简短的例子呢? - sirrocco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接