当存在多个提交案例时,我该怎么办?

时间:2015-04-09 08:03:18

标签: asp.net-mvc submit-button

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

3 个答案:

答案 0 :(得分:3)

  

庞大而通用的行动方法

这完全是你的责任。您编写了将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:”前缀,请务必阅读Q&amp; A和链接的博客):

[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();
}

答案 1 :(得分:2)

您可以使用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">
}

答案 2 :(得分:2)

从上面的信息来看,似乎很难确定这里的确切用例,但是可能没有必要同时拥有确认和取消的帖子。

考虑使用提交事件进行&#34;确认&#34;然后使用普通的HTTP-GET调用取消事件并传递需要取消的项目的ID?然后,您可以直接处理任一操作中的确认或取消事件,也可以对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 }