MVC Multiple Submitbuttons “verarbeiten” / “auswerten”


Oft geht es schneller als man “Multiple Submitbuttons” aussprechen kann und da steht man vor dem “Problem”, das man mehrere Submit Buttons in seinem Formular untergebracht hat. Spätestens dann fragt man sich, wie bekomme ich heraus welcher Button geklickt wurde.

Hier findet man im Netzt die unterschiedlichsten Herangehensweisen. Ich werde hier auf zwei einfache Varianten eingehen, die beim Submit immer die gleiche Controllermethode aufrufen und diese entscheidet dann was zu tun ist.

Die HTML Button Tags für Nummer eins schauen folgendermaßen aus

<button type="submit" class="btn" name="BtnIdPrevDay"><i class="icon-chevron-left"></i></button>
<button type="submit" class="btn" name="BtnIdNextDay"><i class="icon-chevron-right"></i></button>

Hier wurde zur Anzeige ein Symbol/Icon (Twitter Bootstrap) verwenden und kein Text. Wir ermitteln welcher Button geklickt wurde, anhand des Buttonnamen der angegeben wurde, d.h. aber auch das wir jedem Button in unserem Formular einen eindeutigen Namen geben müssen. Dann kann man im Controller überprüfen welcher Button geklickt wurde über die folgende Funktion. Das Model oder die Controlermethode muss für diese Methode auch nicht extra erweitert werden.

[HttpPost]
public ActionResult Worktime(CreateWorktimeEntryModel model)
{
    if (ModelState.IsValid)
    {
        if (Controller.HttpContext.Request.Form.AllKeys.Contains("BtnIdNextDay"))
        {
           //Do some Stuff for this Button
        }
        else if (Controller.HttpContext.Request.Form.AllKeys.Contains("BtnIdPrevDay"))
        {
	        //Do some Other Stuff other button was Clicked          
        }
    }
    return View(model);
}

Das HTML Konstrukt für Nummer zwei schaut folgendermaßen aus

 <button type="submit" class="btn" name="SubmitType" value="Erstellen mit Pause">Erstellen mit Pause</button>
 <button type="submit" class="btn" name="SubmitType" value="Erstellen ohne Pause">Erstellen ohne Pause</button>

Für Variante zwei muss das Model oder die Controllermethode für den Postback entsprechend angepasst werden. Denn bei Methode zwei greifen wir auf MVC Funktionalitäten zurück, die automatisch Werte aus dem Postback Methodenparametern oder Modelproperties zuweisen.

Der erste Lösungsweg sieht eine Erweiterung der Controllermethode für den Postback vor. Diese wird um den string Parameter mit dem Namen “SubtmitType” erweitert. Wenn jetzt ein Button geklickt wird, bei dem als Name “SubmitType” eingetragen ist, steht im Variablennamen der value z.B. “Erstellen mit Pause” und man kann im Controller entscheiden was gemacht werden soll.

[HttpPost]
public ActionResult Worktime(CreateWorktimeEntryModel model, string SubmitType)
{
    if (ModelState.IsValid)
    {
        if (SubmitType == "Erstellen mit Pause")
        {
           //Do some Stuff for this Button
        }
        else if (SubmitType == "Erstellen ohne Pause")
        {
	        //Do some Other Stuff other button was Clicked          
        }
    }
    return View(model);
}

Der zweite Lösungsweg sieht eine Erweiterung des Models vor. Im Model muss ein string Property mit dem Namen “SubmitType” angelegt werden. Bei einem Postback steht dann im Model in unserem Neuen Property welcher Button “value” das Postback ausgelöst hat. Dann können wir wie vorher entscheiden welche Funktion ausgelöst werden soll.

[HttpPost]
public ActionResult Worktime(CreateWorktimeEntryModel model)
{
    if (ModelState.IsValid)
    {
        if (model.SubmitType == "Erstellen mit Pause")
        {
           //Do some Stuff for this Button
        }
        else if (model.SubmitType == "Erstellen ohne Pause")
        {
	        //Do some Other Stuff other button was Clicked          
        }
    }
    return View(model);
}

Update: Eine weitere noch einfachere Lösung sieht folgendermaßen aus:

<button type="submit" name="submitAction" value="option1">click me 1</button>
<button type="submit" name="submitAction" value="option2">click me 2</button>

Hier wird der gleiche Name für alle Buttons hinterlegt und beim Klicken wird der hinterlegte Value dann an unsere Action im Controller übergeben wo wir dann anhand des Values entscheiden was wir ausführen wollen.

public ActionResult MyAction(string submitAction, MyModel model)
{
  ....
}

Quelle:

http://forums.asp.net/p/2000724/5749339.aspx?Re+MVC+with+multiple+submit+buttons

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s