Asp.net core mvc 长度未知的ASP.NET核心模型绑定集合

Asp.net core mvc 长度未知的ASP.NET核心模型绑定集合,asp.net-core-mvc,model-binding,Asp.net Core Mvc,Model Binding,我正在尝试解决如何将集合绑定到asp.net核心中的模型属性。我理解,这样做的方法是包括如下字段: <input type="hidden" asp-for="items[0].Id" /> <input type="hidden" asp-for="items[0].Name" /> <input type="hidden" asp-for="items[1].Id" /> <input type="hidden" asp-for="items[1].

我正在尝试解决如何将集合绑定到asp.net核心中的模型属性。我理解,这样做的方法是包括如下字段:

<input type="hidden" asp-for="items[0].Id" />
<input type="hidden" asp-for="items[0].Name" />
<input type="hidden" asp-for="items[1].Id" />
<input type="hidden" asp-for="items[1].Name" />
这只在表单提交后对项目进行顺序编号,这意味着用户可以添加和删除他们喜欢的任何项目组合,而不会影响向控制器提交值

我相信有人会想出一个更好的方法来解决这个问题(我不是javascript专家),但这对我来说很有效,可能会帮助其他人

更新2


下面@LukasKubris提供的答案是正确的,它比编写映射函数更容易。

您还可以绑定非顺序索引。它只需要一个名为索引的额外字段。因此,不需要有一些helper JS函数

<form method="POST">

    <input type="hidden" name="items.Index" value="7466c69d-4575-4636-9151-f92edd9c25b7" />
    <input type="text" name="items[7466c69d-4575-4636-9151-f92edd9c25b7].Key" value="key1" />
    <input type="text" name="items[7466c69d-4575-4636-9151-f92edd9c25b7].Value" value="value1" />

    <input type="hidden" name="items.Index" value="7466c69d-4575-4636-9151-f92edd9c25b8" />
    <input type="text" name="items[7466c69d-4575-4636-9151-f92edd9c25b8].Key" value="key2" />
    <input type="text" name="items[7466c69d-4575-4636-9151-f92edd9c25b8].Value" value="value2" />

    <input type="submit"/>
</form>

在OnPost处理程序中的用法

public void OnPost(List<Item> items)
{
}
public void OnPost(列表项)
{
}

这是唯一的办法。您必须操作索引。我建议您不要手动执行此操作,而是使用类似于Knockout或Angular的工具,它可以根据内存中的模型列表自动生成输入。然后,您只需推送/弹出项目,客户端框架将为您处理所有HTML。谢谢@ChrisPratt。在此阶段,我试图避免将其中的一个用于如此小的一部分使用。为集合索引器添加隐藏输入,以便绑定非零/非连续索引器。有关示例,请参阅的选项2。也请参考,太好了,非常感谢。我想不出“非顺序”的正确词来搜索这个。
$('#frmSomething').submit(function (e) {
    var selectors = $('.some-group');
    var id = 0;

    selectors.each(function (i, el) {
        var idItem = $(el).find('input.id');
        idItem.prop('name', idItem.prop('name').replace('0', id));

        var nameItem = $(el).find('input.name');
        nameItem.prop('name', nameItem.prop('name').replace('0', id));

        id++;
    });
});
<form method="POST">

    <input type="hidden" name="items.Index" value="7466c69d-4575-4636-9151-f92edd9c25b7" />
    <input type="text" name="items[7466c69d-4575-4636-9151-f92edd9c25b7].Key" value="key1" />
    <input type="text" name="items[7466c69d-4575-4636-9151-f92edd9c25b7].Value" value="value1" />

    <input type="hidden" name="items.Index" value="7466c69d-4575-4636-9151-f92edd9c25b8" />
    <input type="text" name="items[7466c69d-4575-4636-9151-f92edd9c25b8].Key" value="key2" />
    <input type="text" name="items[7466c69d-4575-4636-9151-f92edd9c25b8].Value" value="value2" />

    <input type="submit"/>
</form>
public void OnPost(List<Item> items)
{
}