存在多个提交案例怎么办
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 }
我有一个表格,我可以在其中填写空白然后保存它,这会将我带到我刚刚保存的条目的只读版本。在这一步我有两个选择: "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 }