提问人:coolhand 提问时间:3/19/2018 更新时间:3/19/2018 访问量:15845
将对象列表绑定到表单 [duplicate]
Bind List of objects to a form [duplicate]
问:
我有一类对象: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。Email
Form
form.Signatures
如何确保在 POST 上更新与表单关联的项目的更改?<List>Signature
答:
26赞
Ehsan Sajjad
3/19/2018
#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].Title
Signatures[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 字段并在持久性层中处理它。
评论