我有一个包含多个提交按钮且具有相同值的表单。示例:“继续”。
现在,在ASP.Net MVC的post控制器方法中,我如何知道按下了哪个按钮?
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult DepartmentDetails(string submitButton)
submitButton的值将始终为“Proceed”。我如何知道按下了哪个按钮。
我为每个按钮分配了不同的ID。
感谢。
答案 0 :(得分:4)
试试这个:
<% using (Html.BeginForm())
{ %>
<input type="submit" value="Submit" name="Submit1Button" />
<input type="submit" value="Submit" name="Submit2Button" />
<%} %>
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection values)
{
string buttonName = values.AllKeys.Where((n) => n.EndsWith("Button")).SingleOrDefault();
return View();
}
}
答案 1 :(得分:2)
将页面分成两种不同的形式会不会更有意义吗?
然后,您可以使用Html.BeginForm HtmlHelper方法的参数为每个表单指定不同的Controller(s)Action方法。
答案 2 :(得分:0)
我意识到这个问题很古老,但只是碰到了它,以为我会回答!
这就是我们使用的:
/// <summary>
/// Attribute for Controller methods to decide whether a particular button
/// was clicked and hence whether the method can handle the action.
/// </summary>
public class IfButtonClickedAttribute : ActionMethodSelectorAttribute
{
private readonly IEnumerable<string> _buttonNames;
public IfButtonClickedAttribute(params string[] buttonNames)
{
_buttonNames = buttonNames;
}
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
if (controllerContext.HttpContext.Request.HttpMethod != "POST")
return false;
foreach (string buttonName in _buttonNames)
{
//this first test is for buttons or inputs that have the actual name specified
if (controllerContext.HttpContext.Request.Form[buttonName] != null)
return true;
}
return false;
}
}
然后关于你的行动:
[ActionName("SaveItem"), IfButtonClicked("SaveAsDraft")]
public ActionResult SaveAsDraft(){ ... }
[ActionName("SaveItem"), IfButtonClicked("SaveAsPublished")]
public ActionResult SaveAsPublished(){ ... }