将对象列表绑定到表单

时间:2018-03-19 14:10:51

标签: asp.net-mvc asp.net-core model-binding

我有一类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方法更新相关的签名。例如,如果我更改签名的Email属性并POST表单,则模型不会将此更改绑定到Form对象中。在这种情况下,form.Signatures为空。

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

1 个答案:

答案 0 :(得分:4)

使用for循环生成元素,因为它会为属性名称添加索引,模型绑定器使用该属性名称绑定到不适用于foreach的帖子上的List:

@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等名称进行渲染,模型绑定器可以将其绑定到帖子上的模型。

希望它有所帮助。

相关问题