存在多个提交案例怎么办

What should I do when more than one submit cases exist

我有一个表格,我可以在其中填写空白然后保存它,这会将我带到我刚刚保存的条目的只读版本。在这一步我有两个选择: "Confirm" 或 "Cancel"。这两个操作都会更新数据库中的一些值,因此它们都是提交按钮(当然是 HttpPost)的理想选择。我知道这不应该与特定的网络开发技术联系在一起,因为 总而言之,这都是关于请求和响应的,但我仍然会在 ASP.NET MVC "language" 中讨论,因为这就是我现在正在使用的。到目前为止,我想到的唯一想法是使用不同名称的单独提交按钮,并在服务器端检查名称并采取相应措施。但这对我来说似乎有点难看,因为我可能必须有一个庞大而通用的操作方法。你有更好的方法吗?也许 MVC 有一些用于此目的的内置方式?

您可以使用 2 个表单执行此操作,每个表单发布到不同的操作方法:

<form method="post" action="/cancelAction">
    <input name="id" type="hidden" value="some-id-value">
    <input type="submit" value="Cancel">
</form>

<form method="post" action="/confirmAction">
    <input name="id" type="hidden" value="some-id-value">
    <input type="submit" value="Confirm">
</form>

或者使用 MVC Razor 语法,因为你提到了它:

@using (Html.BeginForm("cancelAction", "MyController", FormMethod.Post))
{
    @Html.HiddenFor(model => model.ID)
    <input type="submit" value="Cancel">
}

@using (Html.BeginForm("confirmAction", "MyController", FormMethod.Post))
{
    @Html.HiddenFor(model => model.ID)
    <input type="submit" value="Confirm">
}

huge and universal action method

这完全是你的责任。您编写操作方法以将 HTTP 请求映射到业务逻辑。

public class PostModel<T>
{
    public string SubmitAction { get; set; } 
    public T TheModel { get; set; }
}

public ActionResult HandleSomePost(PostModel<Foo> model)
{
    switch (model.SubmitAction.ToUpperInvariant())
    {
        case "SAVE":
            _yourBLL.Save(model.TheModel);
            break;
        case "CANCEL":
            _yourBLL.Cancel(model.TheModel);
            break;
        default:
            throw new ArgumentException("SubmitAction");
    }

    return View();
}

然后您可以处理此表单中的两个提交按钮:

@using (Html.BeginForm("HandleSomePost", "TheController", FormMethod.Post))
{
    @Html.EditorFor(m => m.TheModel)
    <input type="submit" name="SubmitAction" value="Cancel">
    <input type="submit" name="SubmitAction" value="Save">
}

但是,这很快就会变得一团糟。您还可以 use attributes 让提交按钮映射到操作方法(尽管为简单起见,我删除了用于本地化的 "action:" 前缀,请务必阅读该问答和链接的博客):

[HttpPost]
[MultipleSubmit(SubmitAction = "Save")]
public ActionResult Save(Foo model) 
{
    _yourBLL.Save(model);
    return View();
}

[HttpPost]
[MultipleSubmit(SubmitAction = "Cancel")]
public ActionResult Cancel(Foo model)
{
    _yourBLL.Cancel(model);
    return View();
}

从上面的信息来看,似乎很难确定这里的确切用例,但是可能不需要同时使用 post 来确认和取消。

考虑使用 "confirmation" 的提交事件,然后使用普通的 HTTP-GET 调用取消事件并传递需要取消的项目的 ID?然后您可以直接处理任一 Action 中的确认或取消事件,或者对 HugeUniversalAction 执行 RedirectToAction。

@using (Html.BeginForm("Confirm","ExampleController",FormMethod.Post))
{
    <input type/>
    <input type="submit" value="confirm"/>
    @Html.ActionLink("Cancel", "ExampleController", id = Model.Id)

}

然后在你的控制器中你可以调用更大的通用方法。

 public ActionResult Cancel(int id)
    {
        // Cancel directly
        // or 
          return RedirectToAction("HugeUniversalAction", new { confirm = "false", id = id });

    }

    [HttpPost]
    public ActionResult Confirm(Foo model)
    {
       // Confirm Directly
       // or 
       return RedirectToAction("HugeUniversalAction", new { confirm = "true", id = model.Id });
    }

然后在 HugeUniversalAction 中以您需要的任何方式处理这两个路径

public ActionResult HugeUniversalAction(int id, confirm = false){ // If confirm confirm it else cancel it }