【问题标题】:Bind List of objects to a form [duplicate]将对象列表绑定到表单[重复]
【发布时间】:2018-03-19 14:10:51
【问题描述】:

我有一类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 属性并发布表单,模型不会将此更改绑定到Form 对象。在这种情况下,form.Signatures 为空。

如何确保对与表单关联的 &lt;List&gt;Signature 项目的更改在 POST 时更新?

【问题讨论】:

  • 副本不适用...

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


【解决方案1】:

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

@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 之类的名称呈现,并且模型绑定器可以在发布时将其绑定到模型。

希望对你有帮助。

【讨论】:

  • 谢谢!这解决了绑定问题。现在我必须找到一种在我的 repo 中调用 save 函数而不使用迭代循环的方法,因为这会导致错误
  • 很高兴为您提供帮助,祝您好运。
  • 这里要注意的一点是,如果可以删除集合中的项目(即:@Model.Signatures[3] 被用户完全删除),那么集合将无法正确序列化。索引需要从 0 开始连续排列
  • 我认为解决方案是在 Signature 模型中使用 isDeleted 字段,并使用任何 JavaScript/CSS 技术使输入变灰或传达已删除状态。然后在发布表单时,检查 isDeleted 字段并在持久层中处理它。
猜你喜欢
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 2017-09-17
  • 2015-01-16
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多