c# - 具有损坏索引的对象的 Razor Pages 模型绑定列表
问题描述
我基本上有一个表单,我在其中添加和删除项目并使用模型绑定将它们绑定到列表。这适用于修改字段和添加新项目,但是当我尝试删除它们时,我破坏了索引并且绑定的列表不包括所有项目。
我生成的标记看起来像这样:
<table>
<tbody>
<tr>
<input type="text" name="devices[0].id" value="8574" />
<input type="text" name="devices[0].type" value="Type1" />
</tr>
<tr>
<input type="text" name="devices[1].id" value="4385" />
<input type="text" name="devices[1].type" value="Type2" />
</tr>
<tr>
<input type="text" name="devices[2].id" value="9486" />
<input type="text" name="devices[2].type" value="Type1" />
</tr>
...
</tbody>
</table>
我的模型绑定是这样的:
public IActionResult OnPostSave(List<Device> devices){
// ... do something
}
现在我让用户操作表单数据,只需通过 javascript 从表中删除行,然后将更新后的表单发送到我的OnPostSave()
. 现在,例如,当删除 ID 为“4385”的行时,该行之后的所有项目都不会被绑定。关于 Scott Hanselman 的这篇文章,这绝对是有道理的,但我想知道是否有解决办法?最好不要在将表单发布到服务器之前修改 js 中的表单。
提前致谢!
解决方案
模型绑定器支持非顺序索引。您必须使用显式索引,该索引由propertyname.Index
为集合中的每个项目调用的隐藏字段表示。我将使用您示例中的设备键值来说明,但索引值可以是任何东西,包括字符串、guid 等:
<tr>
<input type="hidden" name="devices.Index" value="8574" />
<input type="text" name="devices[8574].id" value="8574" />
<input type="text" name="devices[8574].type" value="Type1" />
</tr>
<tr>
<input type="hidden" name="devices.Index" value="4385" />
<input type="text" name="devices[4385].id" value="4385" />
<input type="text" name="devices[4385].type" value="Type2" />
</tr>
<tr>
<input type="hidden" name="devices.Index" value="9486" />
<input type="text" name="devices[9486].id" value="9486" />
<input type="text" name="devices[9486].type" value="Type1" />
</tr>
您可以在此处阅读有关使用顺序和非顺序索引绑定到集合的更多信息:https ://www.learnrazorpages.com/razor-pages/model-binding#binding-complex-collections
推荐阅读
- node.js - 连接字符串中有多个 url 的 MongoDb 行为
- makefile - 为什么 $(INSTALL_BIN) 和 $(INSTALL_DATA) 在 Makefile 中安装文件时总是删除软链接
- java - 具有 Java 向后兼容性的 Kotlin 可选参数
- javascript - Listengin 提交表单 - Javascript
- flutter - StreamProvider:避免重复构建
- c# - 使用 System.Text.Json 将 IConfiguration 序列化回 Json
- python - 在 extras_require 中声明可选依赖项
- python - 如何在不使用 turtle.mainloop() 的情况下停止海龟冻结?
- css - 重用 css 元素
- windows - Windows 将 x.509 主题字段中的状态显示为 S=