MVC cuyo botón de envío ha sido presionado

Tengo dos botones en mi formulario MVC:

  

Desde mi acción de controlador, ¿cómo sé cuál se ha presionado?

Nombra tus dos botones de envío del mismo

   

Luego, en su controlador, obtenga el valor de enviar. Solo el botón presionado pasará su valor.

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

Por supuesto, puede evaluar ese valor para realizar diferentes operaciones con un bloque de interruptor.

 public ActionResult Index(string submit) { switch (submit) { case "Save": // Do something break; case "Process": // Do something break; default: throw new Exception(); break; } return View(); } 
   

Y en su acción de controlador:

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

esta es una mejor respuesta, por lo que podemos tener tanto texto como valor para un botón:

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

     

y el controlador:

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

en resumen, es un botón ENVIAR pero eliges el nombre usando el atributo de nombre, es aún más poderoso porque no estás obligado a enviar el nombre o al botón en los parámetros del método del controlador, puedes llamarlo como quieras …

usted puede identificar su botón desde la etiqueta de su nombre, como a continuación, debe verificar de esta manera en su controlador

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

Aquí hay una manera muy agradable y simple de hacerlo con instrucciones realmente fáciles de seguir usando un MultiButtonAttribute personalizado:

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

Para resumir, haga que sus botones de envío sean así:

   

Tus acciones como esta:

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

Y crea esta clase:

 [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; } } 
 // Buttons   // 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 

Para hacerlo más fácil, le diré que puede cambiar sus botones a los siguientes:

   

Su controlador:

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

Esta publicación no va a responderle a Coppermill, porque le han respondido hace mucho tiempo. Mi publicación será útil para quién buscará una solución como esta. En primer lugar, tengo que decir que “la solución de WDuffy es totalmente correcta” y funciona bien, pero mi solución (no la mía) se usará en otros elementos y hace que la capa de presentación sea más independiente del controlador (porque tu controlador depende de “valor” que se utiliza para mostrar la etiqueta del botón, esta característica es importante para otros idiomas).
Aquí está mi solución, darles diferentes nombres, como:

       

`
Y debe especificar los nombres de los botones como argumentos en la acción como a continuación:

  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 } 

cuando el usuario envía la página usando uno de los botones, solo uno de los argumentos tendrá valor. Creo que esto será útil para otros.
Actualizar
Esta respuesta es bastante antigua y realmente reconsidero mi opinión. tal vez la solución anterior es buena para la situación que pasa el parámetro a las propiedades del modelo. no se molesten y tomen la mejor solución para su proyecto.

Asigne el nombre a ambos botones y Obtenga el valor del formulario.

 

En el lado del controlador:

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

¿No puede descubrir usando Request.Form Collection? Si se hace clic en el proceso, request.form [“process”] no estará vacío