Eli*_*nes 4 c# asp.net model-binding 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>
Run Code Online (Sandbox Code Playgroud)
我的模型绑定如下:
public IActionResult OnPostSave(List<Device> devices){
// ... do something
}
Run Code Online (Sandbox Code Playgroud)
现在,我让用户通过 javascript 简单地从表中删除行,然后将更新后的表单发送到我的OnPostSave(). 现在,例如,当删除 ID 为“4385”的行时,该行之后的所有项目都不会被绑定。关于斯科特·汉塞尔曼的这篇文章,这绝对有道理,但我想知道是否有解决办法?最好在发布到服务器之前不修改js中的表单。
提前致谢!
模型绑定器支持非顺序索引。您必须使用显式索引,该索引由propertyname.Index为集合中的每个项目调用的隐藏字段表示。我将使用示例中的设备键值进行说明,但索引值可以是任何内容,包括字符串、指南等:
<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>
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读有关使用顺序索引和非顺序索引绑定到集合的更多信息: https: //www.learnrazorpages.com/razor-pages/model-binding#binding-complex-collections