视图上的多个按钮 - 不同的方法

时间:2017-12-12 19:33:08

标签: c# asp.net-mvc asp.net-core

我在我的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”但没有成功。当前的格式(如上所述)是“有点”工作的唯一方式(两个按钮都调用一个函数)。

那么 - 我怎么能这样做?如何让两个按钮调用不同的方法?或者可以使用不同的第二个参数调用相同的方法(指示我是否创建订单)。

感谢。

1 个答案:

答案 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中所述