c# - 为什么我的绑定(bind) List<T> 使用 foreach 循环返回空以在 razor 页面上显示值?

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

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

[跟进] 看完Rafalon的回答后,我found this explanation在 for 或 foreach 循环中使用复选框绑定(bind)复杂集合。另外,这是另一个 excellent related link on data binding .

最佳答案

简短的回答:检查为 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

关于c# - 为什么我的绑定(bind) List<T> 使用 foreach 循环返回空以在 razor 页面上显示值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56791436/

相关文章:

c# - 环境变量在配置提供程序中不可见

javascript - 下拉列表更改事件在 IE9 中不起作用

c# - 属性的客户端 ID (ASP.Net MVC)

c# - ItextSharp 在页面中心添加图像,并在其下方添加文本

c# - 不要逃避换行

c# - 使用集成 Windows 身份验证从 MVC 应用程序调用 Web API

Asp.net mvc 如何更改@html.labelfor 中的默认标签文本

c# - 使用 AJAX 3.5 从另一个 DropDownList 填充一个 DropDownList

c# - 如何使用自定义类型重载 System.Math 方法

c# - 在运行时在 ASP.Net Core 中安装新的中间件