在我的剃须刀页面PageModel中,我有一个绑定的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
循环在剃刀页面上以某种形式显示它:
@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>
}
[EDIT]最初我以为所有值都是使用for
循环返回的,但事实证明只返回了.IsAssigned
值... Products
和JobCardId
是空的。我是第一次使用Razor Pages。我在做什么错了?
[关注]阅读Rafalon的答案后,我found this explanation将for或foreach循环中具有复选框的复杂集合绑定在一起。另外这里还有另一个excellent related link on data binding。
答案 0 :(得分:0)
简短的答案:检查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
也一样。