Razor页面中foreach循环内的表单

Razor页面中foreach循环内的表单,razor,asp.net-core,Razor,Asp.net Core,我有一个标准的Razor页面,列出数据库中的所有订单。它的编码非常标准:IListbind属性在页面模型中,OnPost方法。但是,表中的每个记录都有一列,其中包含一个显示订单当前状态的select元素,以及一个按钮,用于在用户决定更改新状态时保存新状态。对每一行的状态进行内联编辑 因此,我的页面中有一个foreach循环,循环遍历我的所有订单: @foreach (var item in Model.Orders) { <tr><td>...</td>

我有一个标准的Razor页面,列出数据库中的所有订单。它的编码非常标准:
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
取决于所选的值类型。