我在我的asp.net(Core)应用程序中有一个视图,它显示了一个购物车。典型的购物车东西 - 它列出了购物车中的物品。每行都有一个可编辑的字段以允许更改数量,每行都有一个可编辑的复选框,允许用户将该行标记为“删除”。
我想在视图底部有两个按钮,一个用于“更新购物车”(这将删除行,更新数量等)。另一个是“创建订单”,它将与“更新购物车”相同,但也会创建订单。
我已经能够创建一个按钮,并让它在控制器中调用适当的方法,但是我在添加第二个按钮时遇到了问题,并让它调用了另一种方法。
目前,我的观点如下:
@model CustomerPortal.Models.StoreViewModels.CartViewModel
@{
ViewData["Title"] = "View";
}
<h2>Shopping Cart</h2>
<form asp-action="UpdateCart">
<table class="table">
<thead>
<tr>
<th>Item</th>
<th>Size</th>
<th>Colour</th>
<th>Quantity</th>
<th>Unit Price Inc. GST</th>
<th>Line Amount Inc. GST</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
@for (var i = 0; i < Model.CartLines.Count; i++)
{
<tr>
@Html.HiddenFor(modelItem => modelItem.CartLines[i].CartLine.ID)
<td>@Html.DisplayFor(modelItem => modelItem.CartLines[i].CartLine.Item.Description)</td>
<td>@Html.DisplayFor(modelItem => modelItem.CartLines[i].CartLine.ItemSize.Name)</td>
<td>@Html.DisplayFor(modelItem => modelItem.CartLines[i].CartLine.ItemColour.Name)</td>
<td>@Html.EditorFor(modelItem => modelItem.CartLines[i].CartLine.Quantity)</td>
<td>@Html.DisplayFor(modelItem => modelItem.CartLines[i].UnitPriceInecTax)</td>
<td>@Html.DisplayFor(modelItem => modelItem.CartLines[i].LineAmountIncTax)</td>
<td>@Html.EditorFor(modelItem => modelItem.CartLines[i].Delete)</td>
</tr>
}
</tbody>
</table>
<div class="form-group">
<input type="submit" value="Update Cart" class="btn btn-default"/>
<input type="submit" value="Create Order" class="btn btn-default"/>
</div>
</form>
ShoppingCartController中的方法如下所示:
[HttpPost, ActionName("UpdateCart")]
[Authorize]
public async Task<IActionResult> UpdateCart(CartViewModel cart)
{
// Need to do some stuff here
return RedirectToAction("Index");
}
[HttpPost, ActionName("CreateOrder")]
[Authorize]
public async Task<IActionResult> CreateOrder(CartViewModel cart)
{
// Need to do some stuff here
return RedirectToAction("Index");
}
我尝试过使用“@using(Html.BeginForm”但没有成功。当前的格式(如上所述)是“有点”工作的唯一方式(两个按钮都调用一个函数)。
那么 - 我怎么能这样做?如何让两个按钮调用不同的方法?或者可以使用不同的第二个参数调用相同的方法(指示我是否创建订单)。
感谢。
答案 0 :(得分:0)
您可以使用html5 formaction
属性从同一表单提交两个不同的网址。
<form asp-action="UpdateCart">
<!-- your form elements -->
<div class="form-group">
<input type="submit" value="Update Cart" formaction="@Url.Action("UpdateCart")"/>
<input type="submit" value="Create Order" formaction="@Url.Action("CreateOrder")"/>
</div>
</form>
在提交按钮上指定formaction
属性时,它将覆盖父窗体的操作属性值。
另一个选项是在javascript中劫持按钮点击事件,并将父表单操作属性值设置为您想要的值并触发提交事件,如this post中所述