Razor页面中foreach循环内的表单

时间:2018-09-04 00:47:06

标签: razor asp.net-core

我有一个标准的Razor页面,该页面列出了数据库中的所有订单。它的编码非常标准:页面模型中的@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 方法。但是,表中的每条记录都有一列,其中包含 select 元素(用于显示订单的当前状态)和 button (如果用户使用)来保存新状态决定更改它。对每一行的状态进行内联编辑。

Form Preview

所以我的页面上有一个 foreach 循环,可以循环浏览所有订单:

String TEXT = "こんにちは。私の名前はオバマです。私はアメリカに行く。";
BreakIterator boundary = BreakIterator.getSentenceInstance(Locale.JAPAN);
boundary.setText(TEXT);
int start = boundary.first();
for (int end = boundary.next();
     end != BreakIterator.DONE;
     start = end, end = boundary.next()) {
     System.out.println(TEXT.substring(start, end));
}

如您所见,最后一列是表格。我想做的是能够提交到我的 OnPost 方法,订单ID(表单中隐藏的 input 元素)和选定状态( select < / strong>中的形式)。但是,这些参数在方法中始终显示为null。我猜想这与以下事实有关:因为同一属性名称有多个 asp-for 元素(每种形式一个-每个订单/行),Razor感到困惑,并且不知道要发送哪一个。

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:0)

示例中的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?

答案 1 :(得分:0)

如果在asp-for属性中指定的属性是IEnumerable,则select标记帮助器将自动生成多选。

public class OrderModel
{
     public IEnumerable<string> OrderStatusId{ get; set; }
}

将asp-for属性绑定到OrderStatusId属性,如下所示:

<select asp-for="OrderStatusId" 
    asp-items="ViewBag.OrderStatus">
</select>