【发布时间】:2018-03-01 14:19:00
【问题描述】:
我正在尝试研究如何将集合模型绑定到 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 下面提供的答案是正确的,它比编写映射函数更容易。
【问题讨论】:
-
这是唯一的方法。您必须操作索引。我建议不要手动执行此操作,而是使用诸如 Knockout 或 Angular 之类的东西,它们可以根据内存中的模型列表自动生成您的输入。然后,您只需推送/弹出项目,客户端框架就会为您处理所有 HTML。
-
谢谢@ChrisPratt。在这个阶段,我正试图避免将其中一个用于如此小部分的使用。
-
为集合索引器添加隐藏输入,以便绑定非零/非连续索引器。例如,请参阅this answer 的选项 2。另请参阅Model Binding To A List
标签: asp.net-core-mvc model-binding