提交button的MVC已被按下

我在我的MVC表单上有两个button:

<input name="submit" type="submit" id="submit" value="Save" /> <input name="process" type="submit" id="process" value="Process" /> 

从我的控制器动作,我怎么知道哪一个被按下?

同时命名您的提交button

 <input name="submit" type="submit" id="submit" value="Save" /> <input name="submit" type="submit" id="process" value="Process" /> 

然后在你的控制器得到提交的价值。 只有点击的button才能通过它的值。

 public ActionResult Index(string submit) { Response.Write(submit); return View(); } 

您当然可以评估这个值,用一个开关块执行不同的操作。

 public ActionResult Index(string submit) { switch (submit) { case "Save": // Do something break; case "Process": // Do something break; default: throw new Exception(); break; } return View(); } 
 <input name="submit" type="submit" id="submit" value="Save" /> <input name="process" type="submit" id="process" value="Process" /> 

在你的控制器动作中:

 public ActionResult SomeAction(string submit) { if (!string.IsNullOrEmpty(submit)) { // Save was pressed } else { // Process was pressed } } 

这是一个更好的答案,所以我们可以有一个button的文本和值:

http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx

 </p> <button name="button" value="register">Register</button> <button name="button" value="cancel">Cancel</button> </p> 

和控制器:

 public ActionResult Register(string button, string userName, string email, string password, string confirmPassword) { if (button == "cancel") return RedirectToAction("Index", "Home"); ... 

总之它的一个SUBMITbutton,但你select名称使用的名称属性,它更强大,因为你没有义务的控制器方法参数的名称提交或button,你可以调用它,只要你喜欢… … –

你可以从下面的名称标签中识别你的button,你需要在你的控制器中这样检查

 if (Request.Form["submit"] != null) { //Write your code here } else if (Request.Form["process"] != null) { //Write your code here } 

这是一个非常简单的方法,使用自定义的MultiButtonAttribute非常简单,

http://blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx

总结一下,让你的提交button是这样的:

 <input type="submit" value="Cancel" name="action" /> <input type="submit" value="Create" name="action" /> 

你的这样的行为:

 [HttpPost] [MultiButton(MatchFormKey="action", MatchFormValue="Cancel")] public ActionResult Cancel() { return Content("Cancel clicked"); } [HttpPost] [MultiButton(MatchFormKey = "action", MatchFormValue = "Create")] public ActionResult Create(Person person) { return Content("Create clicked"); } 

并创build这个类:

 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class MultiButtonAttribute : ActionNameSelectorAttribute { public string MatchFormKey { get; set; } public string MatchFormValue { get; set; } public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) { return controllerContext.HttpContext.Request[MatchFormKey] != null && controllerContext.HttpContext.Request[MatchFormKey] == MatchFormValue; } } 

这篇文章不会回答Coppermill,因为他已经很久以前回答了。 我的文章将有助于谁会寻求这样的解决scheme。 首先,我不得不说,“WDuffy的解决scheme是完全正确的”,它工作正常,但我的解决scheme(不是实际上是我的)将用于其他元素,并使表示层更独立于控制器(因为您的控制器依赖用于显示button标签的“值”,该function对其他语言很重要)。
这是我的解决scheme,给他们不同的名字,像:
</p> <input type="submit" name="buttonSave" value="Save"/> <input type="submit" name="buttonProcess" value="Process"/> <input type="submit" name="buttonCancel" value="Process"/> </p>
而且您必须在下面的动作中指定button的名称作为参数:

  public ActionResult Register(string buttonSave, string buttonProcess, string buttonCancel){if (buttonSave!= null) {//save is pressed } if (buttonProcess!= null) {//Process is pressed } if (buttonCancel!= null) {//Cancel is pressed } 

当用户使用其中一个button提交页面时,只有一个参数具有值。 我想这会对别人有帮助。

 // Buttons <input name="submit" type="submit" id="submit" value="Save" /> <input name="process" type="submit" id="process" value="Process" /> // Controller [HttpPost] public ActionResult index(FormCollection collection) { string submitType = "unknown"; if(collection["submit"] != null) { submitType = "submit"; } else if (collection["process"] != null) { submitType = "process"; } } // End of the index method 

为了更容易,我会说你可以改变你的button到以下内容:

 <input name="btnSubmit" type="submit" value="Save" /> <input name="btnProcess" type="submit" value="Process" /> 

你的控制器:

 public ActionResult Create(string btnSubmit, string btnProcess) { if(btnSubmit != null) // do something for the Button btnSubmit else // do something for the Button btnProcess } 

给这两个button的名称,并从窗体中检查值。

 <div> <input name="submitButton" type="submit" value="Register" /> </div> <div> <input name="cancelButton" type="submit" value="Cancel" /> </div> 

在控制器端:

 public ActionResult Save(FormCollection form) { if (this.httpContext.Request.Form["cancelButton"] !=null) { // return to the action; } if (this.httpContext.Request.Form["submitButton"] !=null) { // save the oprtation and retrun to the action; } } 

你不能找出使用Request.Form集合? 如果进程被点击,request.form [“process”]将不会为空