MVC que botão de envio foi pressionado

Eu tenho dois botões no meu formulário MVC:

  

Da minha ação do controlador, como sei qual foi pressionado?

Nomeie seus dois botões de envio da mesma

   

Em seguida, no seu controlador, obtenha o valor de envio. Apenas o botão clicado passará seu valor.

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

É claro que você pode avaliar esse valor para executar diferentes operações com um bloco de interruptores.

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

E na sua ação de controlador:

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

essa é uma resposta melhor, então podemos ter texto e valor para um botão:

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

     

e o controlador:

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

em suma, é um botão SUBMIT mas você escolhe o nome usando o atributo name, é ainda mais poderoso porque você não é obrigado a enviar o nome ou botão nos parâmetros do método controlador, você pode chamá-lo como quiser …

você pode identificar o seu botão de lá nome tag como abaixo, você precisa verificar como este no seu controlador

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

Aqui está uma maneira muito legal e simples de fazer isso com instruções fáceis de seguir usando um MultiButtonAttribute personalizado:

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

Para resumir, faça seus botões de envio assim:

   

Suas ações assim:

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

E crie esta class:

 [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 tornar mais fácil, direi que você pode alterar seus botões para o seguinte:

   

Seu controlador:

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

Este post não vai responder a Coppermill, porque ele foi respondido há muito tempo. Meu post será útil para quem buscar uma solução como essa. Primeiro de tudo, eu tenho que dizer “A solução do WDuffy está totalmente correta” e funciona bem, mas minha solução (na verdade não minha) será usada em outros elementos e torna a camada de apresentação mais independente do controlador (porque seu controlador depende “valor” que é usado para mostrar o label do botão, esse recurso é importante para outros idiomas.
Aqui está a minha solução, dê-lhes nomes diferentes, como:

       

`
E você deve especificar os nomes dos botões como argumentos na ação como abaixo:

  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 } 

quando o usuário envia a página usando um dos botões, apenas um dos argumentos terá valor. Eu acho que isso será útil para os outros.
Atualizar
Essa resposta é bem antiga e eu realmente reconsidero minha opinião. talvez a solução acima seja boa para a situação que passa o parâmetro para as propriedades do modelo. não se incomodem e tomem a melhor solução para o seu projeto.

Dê o nome a ambos os botões e obtenha o valor do formulário.

 

No lado do 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; } } 

Você não consegue descobrir usando a coleção Request.Form? Se o processo for clicado, o request.form [“process”] não estará vazio