为什么绑定的List <T>使用foreach循环返回空以在剃刀页面上显示值?

时间:2019-06-27 12:50:47

标签: c# asp.net-core razor razor-pages

在我的剃须刀页面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值... ProductsJobCardId是空的。我是第一次使用Razor Pages。我在做什么错了?

[关注]阅读Rafalon的答案后,我found this explanation将for或foreach循环中具有复选框的复杂集合绑定在一起。另外这里还有另一个excellent related link on data binding

1 个答案:

答案 0 :(得分:0)

简短的答案:检查forforeach生成的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也一样。