带有损坏索引的对象的Razor Pages模型绑定列表

时间:2019-02-28 13:15:36

标签: 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>

和我的模型绑定是这样的:

public IActionResult OnPostSave(List<Device> devices){
    // ... do something
}

现在,我允许用户通过使用javascript从表中删除行,然后将更新后的表单发送到我的OnPostSave()来操纵表单数据。现在,例如,当删除具有ID“ 4385”的行时,该行之后的所有项目都不会被绑定。关于Scott Hanselman的post,这绝对是有道理的,但是我想知道是否可以解决这个问题?最好在将表单发布到服务器之前不修改js中的表单。

谢谢!

1 个答案:

答案 0 :(得分:1)

模型绑定器支持非顺序索引。您必须使用一个显式索引,该索引由集合中每个项目的名为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

了解更多有关使用顺序索引和非顺序索引绑定到集合的信息。