Mam dwa przyciski na moim formularzu MVC:
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
Na podstawie mojej akcji kontrolera skąd mam wiedzieć, który z nich został naciśnięty?
c#
asp.net
asp.net-mvc
razor
Coppermill
źródło
źródło
<input name="submit" type="submit" id="submit" value="Save" onclick="saveMethod" />
:?Odpowiedzi:
Nazwij oba przyciski przesyłania tak samo
<input name="submit" type="submit" id="submit" value="Save" /> <input name="submit" type="submit" id="process" value="Process" />
Następnie w kontrolerze uzyskaj wartość zgłoszenia. Tylko kliknięty przycisk przekaże swoją wartość.
public ActionResult Index(string submit) { Response.Write(submit); return View(); }
Możesz oczywiście ocenić tę wartość, aby wykonać różne operacje za pomocą bloku przełączników.
public ActionResult Index(string submit) { switch (submit) { case "Save": // Do something break; case "Process": // Do something break; default: throw new Exception(); break; } return View(); }
źródło
<button type="submit" name="action" value="draft"> Internationalized Save Text </button>
do celów i18n, więc ciąg znaków dla użytkownika można dostosować, a nazwy elementów formularza nigdy nie są bezpośrednio ujawniane użytkownikowi (co jest dziwne samo w sobie)<input name="submit" type="submit" id="submit" value="Save" /> <input name="process" type="submit" id="process" value="Process" />
A w akcji kontrolera:
public ActionResult SomeAction(string submit) { if (!string.IsNullOrEmpty(submit)) { // Save was pressed } else { // Process was pressed } }
źródło
to jest lepsza odpowiedź, więc możemy mieć zarówno tekst, jak i wartość dla przycisku:
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>
a kontroler:
public ActionResult Register(string button, string userName, string email, string password, string confirmPassword) { if (button == "cancel") return RedirectToAction("Index", "Home"); ...
w skrócie jest to przycisk WYŚLIJ, ale nazwę wybierasz za pomocą atrybutu nazwy, jest to jeszcze potężniejsze, ponieważ nie jesteś zobowiązany do przesłania nazwy lub przycisku w parametrach metody kontrolera, możesz to nazwać jak chcesz ...
źródło
możesz zidentyfikować swój przycisk stamtąd plakietkę jak poniżej, musisz to sprawdzić w swoim kontrolerze
if (Request.Form["submit"] != null) { //Write your code here } else if (Request.Form["process"] != null) { //Write your code here }
źródło
Oto naprawdę przyjemny i prosty sposób na zrobienie tego z naprawdę łatwymi do wykonania instrukcjami przy użyciu niestandardowego MultiButtonAttribute:
http://blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx
Podsumowując, utwórz przyciski przesyłania w ten sposób:
<input type="submit" value="Cancel" name="action" /> <input type="submit" value="Create" name="action" />
Twoje działania w ten sposób:
[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"); }
I stwórz tę klasę:
[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; } }
źródło
MultiButtonAttribute
niestandardowego atrybutu, który umożliwia rozróżnianie przycisków przesyłania. Właściwie całkiem niezły pomysł.Arnis L.
zastosował się do tej samej rady, być może zauważyłeś, że podał dokładnie ten sam link 4 lata wcześniej:>// 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
źródło
Aby to ułatwić, powiem, że możesz zmienić przyciski na następujące:
<input name="btnSubmit" type="submit" value="Save" /> <input name="btnProcess" type="submit" value="Process" />
Twój kontroler:
public ActionResult Create(string btnSubmit, string btnProcess) { if(btnSubmit != null) // do something for the Button btnSubmit else // do something for the Button btnProcess }
źródło
Ten post nie będzie odpowiadał Coppermillowi, ponieważ otrzymał odpowiedź dawno temu. Mój post będzie pomocny dla tego, kto będzie szukał takiego rozwiązania. Przede wszystkim muszę powiedzieć, że "rozwiązanie WDuffy jest całkowicie poprawne" i działa dobrze, ale moje rozwiązanie (nie moje) zostanie użyte w innych elementach i uniezależni warstwę prezentacji od kontrolera (ponieważ twój kontroler zależy od „wartość”, która służy do wyświetlania etykiety przycisku, ta funkcja jest ważna dla innych języków).
Oto moje rozwiązanie, nadaj im różne nazwy:
<input type="submit" name="buttonSave" value="Save"/> <input type="submit" name="buttonProcess" value="Process"/> <input type="submit" name="buttonCancel" value="Cancel"/>
I musisz określić nazwy przycisków jako argumenty w akcji jak poniżej:
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 } }
gdy użytkownik prześle stronę za pomocą jednego z przycisków, tylko jeden z argumentów będzie miał wartość. Myślę, że będzie to pomocne dla innych.
Aktualizacja
Ta odpowiedź jest dość stara i właściwie ponownie rozważam swoją opinię. być może powyższe rozwiązanie jest dobre dla sytuacji, która przekazuje parametr do właściwości modelu. nie przejmuj się i wybierz najlepsze rozwiązanie dla swojego projektu.
źródło
input[type=submit]
wartość, która została wyzwolona, więc wszystkie mogą powiązać model z właściwością o tej samejname
(np.action
), A następnie możesz rozróżnić przyciski na podstawievalue
tego ciągu bez konieczności wprowadzania tak wielu zmiennych w podpisie . Poświęć trochę czasu na przemyślenie formatowania / wcięć przed wysłaniem.Nie możesz się tego dowiedzieć za pomocą Request.Form Collection? Po kliknięciu procesu request.form ["proces"] nie będzie pusty
źródło
Nadaj nazwę obu przyciskom i pobierz wartość sprawdzenia z formularza.
<div> <input name="submitButton" type="submit" value="Register" /> </div> <div> <input name="cancelButton" type="submit" value="Cancel" /> </div>
Po stronie sterownika:
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; } }
źródło
Na stronach Core 2.2 Razor działa ta składnia:
<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) { .......
źródło
string submit
niż pisaniestring submit = Request.Form["Submit"];
. Jedną z największych zalet Razor Pages i / lub MVC jest czytelność metod, w przeciwnym razie może to być PHP.