在我的 Razor 页面 PageModel 中,我有一个绑定(bind) List<T>
属性:
[BindProperty]
public List<JobCard> CustomerSpecificJobCards { get; set; }
这是 JobCard 模型:
public partial class JobCard
{
public int JobCardId { get; set; }
public string Products { get; set; }
public string CusCode { get; set; }
public string Category { get; set; }
public bool IsAssigned { get; set; }
}
列表JobCards
在用户从页面发布订单号后填充:
CustomerSpecificJobCards = AllJobCards.Where(jc => jc.CusCode == WorkOrderInfo.MarkForCusCode).ToList();
然后通过 foreach
以表格形式显示在 Razor 页面上循环:
@foreach (var card in Model.CustomerSpecificJobCards)
{
<div class="col-1"><input asp-for="@card.IsAssigned" /></div>
<div class="col-9">@card.Products</div>
<div class="col-2">@card.JobCardId</div>
}
用户会看到工作卡列表和一个复选框。检查后,用户提交选择。当我查看 CustomerSpecificJobCards
已发布,列表为空。为什么?基于information here , 我决定更改 foreach
循环到 for
循环:
@for (var card = 0; card < Model.CustomerSpecificJobCards.Count; card++)
{
<div class="col-1"><input asp-for="@Model.CustomerSpecificJobCards[card].IsAssigned" /></div>
<div class="col-9">@Model.CustomerSpecificJobCards[card].Products</div>
<div class="col-2">@Model.CustomerSpecificJobCards[card].JobCardId</div>
}
[编辑] 最初,我认为所有值都是使用 for
返回的循环,但结果只有 .IsAssigned
返回值... Products
和 JobCardId
是空的。我是第一次使用 Razor Pages。我做错了什么?
[跟进] 看完Rafalon的回答后,我found this explanation在 for 或 foreach 循环中使用复选框绑定(bind)复杂集合。另外,这是另一个 excellent related link on data binding .
最佳答案
简短的回答:检查为 for
和 foreach
生成的 HTML,你会发现对于 foreach
,你不能指望表单以正确返回 List
(使用 asp-for
帮助程序)。
for
是必需的,因此您可以获得可索引的输入,如下所示:
<input name='CustomerSpecificJobCards[0].IsAssigned'
id='CustomerSpecificJobCards_0__IsAssigned' />
你仍然可以使用 foreach
来完成它,但是如果没有 asp-for
它会非常乏味,并且你的模型必须满足一些要求(例如具有索引属性) .
您的其他问题来自于 @Model.CustomerSpecificJobCards[card].Products
仅为文本这一事实。
因此,您应该将其替换为 input
,就像 IsAssigned
一样,或者您可以添加一个隐藏的输入:
<input type="hidden" asp-for="Model.CustomerSpecificJobCards[card].Products" />
同样适用于 JobCardId
。
关于c# - 为什么我的绑定(bind) List<T> 使用 foreach 循环返回空以在 razor 页面上显示值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56791436/