Ho due pulsanti sul mio modulo MVC:
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
Dall'azione del mio controller come faccio a sapere quale è stato premuto?
Ho due pulsanti sul mio modulo MVC:
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
Dall'azione del mio controller come faccio a sapere quale è stato premuto?
Risposte:
Assegna allo stesso modo entrambi i pulsanti di invio
<input name="submit" type="submit" id="submit" value="Save" />
<input name="submit" type="submit" id="process" value="Process" />
Quindi nel controller ottieni il valore di submit. Solo il pulsante selezionato passerà il suo valore.
public ActionResult Index(string submit)
{
Response.Write(submit);
return View();
}
Ovviamente puoi valutare quel valore per eseguire diverse operazioni con un blocco switch.
public ActionResult Index(string submit)
{
switch (submit)
{
case "Save":
// Do something
break;
case "Process":
// Do something
break;
default:
throw new Exception();
break;
}
return View();
}
<button type="submit" name="action" value="draft"> Internationalized Save Text </button>
per scopi i18n, quindi l'utente che affronta la stringa è personalizzabile, e i nomi degli elementi del modulo non sono mai direttamente esposti all'utente (che è strano in sé e per sé)
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
E nell'azione del 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 testo che valore per un pulsante:
</p>
<button name="button" value="register">Register</button>
<button name="button" value="cancel">Cancel</button>
</p>
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 INVIA ma tu scegli il nome usando l'attributo name, è ancora più potente perché non sei obbligato a inviare il nome o il pulsante nei parametri del metodo del controller, puoi chiamarlo come preferisci ...
puoi identificare il tuo pulsante da lì tag nome come di seguito, è necessario controllare in questo modo nel controller
if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}
Ecco un modo davvero carino e semplice per farlo con istruzioni davvero facili da seguire usando un MultiButtonAttribute personalizzato:
Per riassumere, fai i pulsanti di invio in questo modo:
<input type="submit" value="Cancel" name="action" />
<input type="submit" value="Create" name="action" />
Le tue azioni in questo modo:
[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 classe:
[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;
}
}
MultiButtonAttribute
attributo personalizzato per consentire la differenziazione tra i pulsanti di invio. In realtà una bella idea.
Arnis L.
avesse seguito lo stesso consiglio, potresti aver notato che aveva fornito lo stesso identico link 4 anni prima:>
// 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
Per semplificare, dirò che è possibile modificare i pulsanti come segue:
<input name="btnSubmit" type="submit" value="Save" />
<input name="btnProcess" type="submit" value="Process" />
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 "La soluzione di WDuffy è totalmente corretta" e funziona benissimo, ma la mia soluzione (non proprio 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:
<input type="submit" name="buttonSave" value="Save"/>
<input type="submit" name="buttonProcess" value="Process"/>
<input type="submit" name="buttonCancel" value="Cancel"/>
E devi specificare i nomi dei pulsanti come argomenti nell'azione come sotto:
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 è piuttosto vecchia e in realtà riconsidero la mia opinione. forse sopra la soluzione è buona per la situazione che passa il parametro alle proprietà del modello. non preoccuparti e prendi la migliore soluzione per il tuo progetto.
input[type=submit]
valore che è stato attivato, in modo che tutti i modelli possano essere associati a una proprietà con lo stesso name
(es. action
) E quindi è possibile differenziare i pulsanti in base a value
quella stringa senza la necessità di introdurre tante variabili nella firma . Ti preghiamo inoltre di dedicare un po 'di tempo a pensare alla formattazione / rientro prima di pubblicare.
Assegna il nome a entrambi i pulsanti e ottieni il segno di spunta dal valore.
<div>
<input name="submitButton" type="submit" value="Register" />
</div>
<div>
<input name="cancelButton" type="submit" value="Cancel" />
</div>
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;
}
}
Nelle pagine Core 2.2 Razor questa sintassi funziona:
<button type="submit" name="Submit">Save</button>
<button type="submit" name="Cancel">Cancel</button>
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
return Page();
var sub = Request.Form["Submit"];
var can = Request.Form["Cancel"];
if (sub.Count > 0)
{
.......
string submit
scrittura string submit = Request.Form["Submit"];
. Uno dei maggiori vantaggi di Razor Pages e / o MVC è la leggibilità dei metodi, altrimenti potrebbe essere PHP.
<input name="submit" type="submit" id="submit" value="Save" onclick="saveMethod" />
:?