我有一个标准的 Razor 页面,其中列出了我数据库中的所有订单。它的编码非常标准:IList<Order>
页面模型中的绑定(bind)属性, OnPost 方法。但是,表中的每条记录都有一个带有 的列。选择 显示订单当前状态的元素,以及 按钮 如果用户决定更改它,则保存新状态。每行状态的内联编辑排序。
所以我有一个 foreach 在我的页面中循环,循环遍历我的所有订单:
@foreach (var item in Model.Orders)
{
<tr><td>...</td></tr>
<tr>
<td>
<form method="post" class="form-inline">
<input type="hidden" value="@item.Id"/>
<select asp-for="@item.OrderStatusId"
class="form-control form-control-sm"
asp-items="ViewBag.OrderStatusId"></select>
<button type="submit" class="btn btn-secondary btn-sm">
<i class="fas fa-save"></i>
</button>
</form>
</td>
</tr>
}
如您所见,最后一列是 表格 .我想做的是能够提交到我的 OnPost 方法、订单 ID(隐藏 输入 表单中的元素)和选中状态( 选择 表单中的元素)。但是,这些参数在方法中始终显示为 null。我猜这与以下事实有关,因为有多个 asp-for 具有相同属性名称的元素(每个表单一个 - 每个订单/行),Razor 会感到困惑,不知道要发送哪个。
有没有解决的办法?
最佳答案
foreach
您示例中的循环生成相同的 name
<select>
的属性元素,这解释了为什么 Razor 感到困惑(而且它也是无效的 HTML)。假设Model.Orders
工具IEnumerable
,你应该使用 for
每次迭代的循环和数字索引以生成不同的 <select>
元素名称:
<form method="post" class="form-inline">
@for (int i = 0; i < Model.Orders.Count; i++)
{
<tr><td>...</td></tr>
<tr>
<td>
<input type="hidden" value="@item.Id"/>
<select asp-for="Model.Orders[i].OrderStatusId" class="form-control form-control-sm"
asp-items="ViewBag.OrderStatusId"></select>
</td>
</tr>
}
<button type="submit" class="btn btn-secondary btn-sm">
<i class="fas fa-save">Save</i>
</button>
</form>
注:我特意放了
<form>
& 提交 <button>
循环外的标签,因为没有必要创建多个 <form>
标签(和多个提交按钮)无需设置 action
里面的属性for
循环,除非另有说明。类似问题:How can I bind an array with asp-for tag?
关于razor - Razor Page 中的 foreach 循环内的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52157469/