我有一个标准的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 (如果用户使用)来保存新状态决定更改它。对每一行的状态进行内联编辑。
所以我的页面上有一个 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感到困惑,并且不知道要发送哪一个。
有没有办法解决这个问题?
答案 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
属性。
答案 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>