将对象列表绑定到表单 [duplicate]

Bind List of objects to a form [duplicate]

提问人:coolhand 提问时间:3/19/2018 更新时间:3/19/2018 访问量:15845

问:

我有一类对象:Signature

public class Signature
    {
        public int SignatureID { get; set; }
        public int FormID { get; set; }
        public string Title { get; set; }
        public string Email { get; set; }
        [Display(Name = "Signed Date:")]
        public DateTime? Date { get; set; }
    }

我有一个具有虚拟签名列表的类Form.cs

public virtual List<Signature> Signatures { get; set; }

在我的控制器中,我按以下条件填充列表:

form.Signatures = repository.Signatures.Where(s => s.FormID == form.FormID).ToList();

在我的表单视图中,我显示了关联签名的列表:

@foreach (var signature in Model.Signatures)
    {
    <div class="text-center">
        <label asp-for="@signature.Title"></label>
        <input asp-for="@signature.Title" />
        <label asp-for="@signature.Email"></label>
        <input asp-for="@signature.Email" />
        <label asp-for="@signature.Date"></label>
        <input disabled asp-for="@signature.Date">
    </div>
    }

但是,我不知道如何在表单的 POST 方法上更新关联的签名。例如,如果我更改签名的属性并 POST 表单,则模型不会将此更改绑定到对象中。在本例中,为 null。EmailFormform.Signatures

如何确保在 POST 上更新与表单关联的项目的更改?<List>Signature

asp.net-mvc asp.net-core 模型绑定

评论

3赞 Boiethios 10/10/2019
重复项不适用...

答:

26赞 Ehsan Sajjad 3/19/2018 #1

使用循环生成元素,因为它会为属性名称添加索引,模型活页夹使用该属性名称绑定到帖子上的列表,这不适用于:forforeach

@for (int i=0; i< Model.Signatures.Count; i++)
{
<div class="text-center">
    <label asp-for="@Model.Signatures[i].Title"></label>
    <input asp-for="@Model.Signatures[i].Title" />
    <label asp-for="@Model.Signatures[i].Email"></label>
    <input asp-for="@Model.Signatures[i].Email" />
    <label asp-for="@Model.Signatures[i].Date"></label>
    <input disabled asp-for="@Model.Signatures[i].Date">
</div>
}

现在,元素将使用类似 的名称进行渲染,模型活页夹可以在发布时将其绑定到模型。Signatures[0].TitleSignatures[1].Title

希望它有所帮助。

评论

0赞 coolhand 3/19/2018
谢谢!这修复了绑定问题。现在,我必须找到一种在不使用迭代循环的情况下调用存储库中的函数的方法,因为这会导致错误save
0赞 Ehsan Sajjad 3/19/2018
很高兴提供帮助,祝你好运。
0赞 GregH 3/19/2018
这里需要注意的一点是,如果可以删除集合中的项目(即:由用户完全删除),则该集合将无法正确序列化。索引需要按从 0 开始的连续顺序排列@Model.Signatures[3]
1赞 tnk479 2/13/2021
我假设解决方案是在签名模型中使用 isDeleted 字段,并使用任何 JavaScript/CSS 技术将输入变灰或传达已删除状态。然后,在发布表单时,检查 isDeleted 字段并在持久性层中处理它。