MVC che è stato premuto il pulsante di invio

Ho due pulsanti sul mio modulo MVC:

  

Dall’azione del mio controller come faccio a sapere quale è stato premuto?

Denominare entrambi i pulsanti di invio allo stesso modo

   

Quindi nel tuo controller ottieni il valore di submit. Solo il pulsante cliccato passerà il suo valore.

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

Ovviamente è ansible valutare quel valore per eseguire diverse operazioni con un blocco di commutazione.

 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 nell’azione del tuo controller:

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

questa è una risposta migliore, quindi possiamo avere sia il testo che il valore per un pulsante:

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

     

e il controller:

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

in breve è un pulsante SUBMIT ma tu scegli il nome usando l’attributo name, è ancora più potente perché non sei obbligato al nome submit o button nei parametri del metodo controller, puoi chiamarlo come preferisci …

puoi identificare il tuo pulsante da lì nome tag come sotto, è necessario controllare come questo nel tuo controller

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

Ecco un modo veramente bello e semplice di farlo con istruzioni davvero facili da seguire usando un MultiButtonAttribute personalizzato:

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

Per riassumere, fai i tuoi pulsanti di invio in questo modo:

   

Le tue azioni come questa:

 [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 crea questa 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 

Per semplificare, dirò che puoi modificare i tuoi pulsanti come segue:

   

Il tuo controller:

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

Questo post non risponderà a Coppermill, perché gli è stato risposto molto tempo fa. Il mio post sarà utile per chi cercherà una soluzione come questa. Prima di tutto, devo dire che “la soluzione di WDuffy è totalmente corretta” e funziona bene, ma la mia soluzione (non in realtà la mia) verrà utilizzata in altri elementi e rende il livello di presentazione più indipendente dal controller (perché il controller dipende da “valore” che viene utilizzato per mostrare l’etichetta del pulsante, questa funzione è importante per altre lingue.).
Ecco la mia soluzione, dai loro nomi diversi, come:

       

`
E devi specificare i nomi dei pulsanti come argomenti nell’azione come di seguito:

  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 l’utente invia la pagina utilizzando uno dei pulsanti, solo uno degli argomenti avrà valore. Immagino che questo sarà utile per gli altri.
Aggiornare
Questa risposta è abbastanza vecchia e in effetti riconsiderò la mia opinione. forse sopra la soluzione va bene per la situazione che passa il parametro alle proprietà del modello. non preoccupatevi e prendete la migliore soluzione per il vostro progetto.

Dare il nome a entrambi i pulsanti e ottenere il controllo del valore dal modulo.

 

Sul lato controller:

 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; } } 

Non riesci a scoprire usando Request.Form Collection? Se si fa clic sul processo, request.form [“processo”] non sarà vuoto