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

时间:2018-03-01 14:19:00

标签: 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].Name" />

但是,如果您想允许用户添加其他项目和/或删除其他项目,您会怎么做?在这种情况下,我使用javascript添加这些项客户端,他们可能会添加一个新项目到最后并从中间删除一个,这可能会导致如下所示:

<input type="hidden" asp-for="items[1].Id" />
<input type="hidden" asp-for="items[1].Name" />
<input type="hidden" asp-for="items[3].Id" />
<input type="hidden" asp-for="items[3].Name" />

ASP.NET Cores模型绑定然后不会将集合绑定到模型属性(我假设因为索引未对齐)。

有没有办法让这项工作?我试图避免写一些东西来“重新标记”这些字段的索引。

更新

对于其他任何绊倒的人,我将所有元素添加到名称为0的容器内的页面中,如下所示:

<div class="some-group">
    <input type="hidden" class="id" asp-for="items[0].Id" />
    <input type="hidden" class="name" asp-for="items[0].Name" />
    <input type="hidden" class="id" asp-for="items[0].Id" />
    <input type="hidden" class="name" asp-for="items[0].Name" />
</div>

然后我添加了以下内容以循环并在提交表单时重命名它们。

$('#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++;
    });
});

只有在提交表单后才会对项目进行顺序编号,这意味着用户可以添加和删除他们喜欢的任何项目组合,而不会影响向控制器提交值。

我确信有人可以想出一个更好的解决方法(我不是javascript专家),但这对我有用,可能对其他人有用。

更新2

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

1 个答案:

答案 0 :(得分:2)

您还可以绑定非顺序指数。它只需要额外的字段索引。所以没有必要使用一些辅助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)
{
}