Razor页面中foreach循环内的表单
我有一个标准的Razor页面,列出数据库中的所有订单。它的编码非常标准:Razor页面中foreach循环内的表单,razor,asp.net-core,Razor,Asp.net Core,我有一个标准的Razor页面,列出数据库中的所有订单。它的编码非常标准:IListbind属性在页面模型中,OnPost方法。但是,表中的每个记录都有一列,其中包含一个显示订单当前状态的select元素,以及一个按钮,用于在用户决定更改新状态时保存新状态。对每一行的状态进行内联编辑 因此,我的页面中有一个foreach循环,循环遍历我的所有订单: @foreach (var item in Model.Orders) { <tr><td>...</td>
IList
bind属性在页面模型中,OnPost方法。但是,表中的每个记录都有一列,其中包含一个显示订单当前状态的select元素,以及一个按钮,用于在用户决定更改新状态时保存新状态。对每一行的状态进行内联编辑
因此,我的页面中有一个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>
}
@foreach(Model.Orders中的变量项)
{
...
}
如您所见,最后一列是表单。我想做的是能够提交到我的OnPost方法、订单id(表单中隐藏的输入元素)和所选状态(表单中选择元素)。但是,这些参数在方法中始终显示为null。我猜这与一个事实有关,因为同一属性名的元素有多个asp(每个表单一个,每个订单/行一个),Razor会感到困惑,不知道该发送哪一个
有办法解决这个问题吗?示例中的
foreach
循环为
元素生成相同的name
属性,这解释了Razor为什么会混淆(它也是无效的HTML)。假设Model.Orders
实现了IEnumerable
,您应该为每次迭代使用for
循环和数字索引来生成不同的
元素名称:
<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>
@对于(int i=0;i
注意:我故意将
&submit
标记放在循环之外,因为没有必要在循环的内部设置操作
属性而创建多个
标记(和多个提交按钮),除非另有规定
类似问题:如果asp for属性中指定的属性是IEnumerable,则select标记帮助器将自动生成一个multi-select
public class OrderModel
{
public IEnumerable<string> OrderStatusId{ get; set; }
}
公共类OrderModel
{
公共IEnumerable OrderStatusId{get;set;}
}
将asp for属性绑定到OrderStatusId属性,如下所示:
<select asp-for="OrderStatusId"
asp-items="ViewBag.OrderStatus">
</select>
感谢您提供的信息,我将试一试,不过我确实需要循环中的表单和按钮,以便它们可以单独保存。但是,我确实有一个问题:OnPost方法中的参数必须命名为什么样的?id和orderStatusId?参数名称应与表单元素中传递的名称相同。如果表单提交传递了多个select
元素,则应将参数类型设置为List
,其中T
取决于所选的值类型。