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