Ich habe zwei Schaltflächen in meinem MVC-Formular:
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
Woher weiß ich aus meiner Controller-Aktion, welche gedrückt wurden?
c#
asp.net
asp.net-mvc
razor
Kupfermühle
quelle
quelle
<input name="submit" type="submit" id="submit" value="Save" onclick="saveMethod" />
?Antworten:
Benennen Sie beide Senden-Schaltflächen gleich
Dann erhalten Sie in Ihrem Controller den Wert von submit. Nur die angeklickte Schaltfläche übergibt ihren Wert.
Sie können diesen Wert natürlich bewerten, um verschiedene Operationen mit einem Schalterblock auszuführen.
quelle
<button type="submit" name="action" value="draft"> Internationalized Save Text </button>
für i18n-Zwecke verwenden, sodass die dem Benutzer zugewandte Zeichenfolge anpassbar ist und Formularelementnamen niemals direkt dem BenutzerUnd in Ihrer Controller-Aktion:
quelle
Dies ist eine bessere Antwort, sodass wir sowohl Text als auch Wert für eine Schaltfläche haben können:
http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx
und der Controller:
Kurz gesagt, es ist eine SUBMIT-Schaltfläche, aber Sie wählen den Namen mithilfe des Namensattributs. Dies ist sogar noch leistungsfähiger, da Sie nicht an den Namen Submit oder die Schaltfläche in den Parametern der Controller-Methode gebunden sind. Sie können ihn nach Belieben aufrufen.
quelle
Sie können Ihre Schaltfläche anhand des Namensschilds wie unten identifizieren. Sie müssen dies in Ihrem Controller überprüfen
quelle
Hier ist eine wirklich schöne und einfache Möglichkeit, dies mit wirklich einfach zu befolgenden Anweisungen unter Verwendung eines benutzerdefinierten MultiButtonAttribute zu tun:
http://blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx
Um es zusammenzufassen, machen Sie Ihre Senden-Schaltflächen wie folgt:
Ihre Aktionen wie folgt:
Und erstelle diese Klasse:
quelle
MultiButtonAttribute
benutzerdefiniertes Attribut empfohlen wird, um zwischen den Schaltflächen zum Senden zu unterscheiden. Eigentlich eine ganz schöne Idee.Arnis L.
den gleichen Rat befolgt hätten, hätten Sie vielleicht bemerkt, dass er 4 Jahre zuvor genau den gleichen Link bereitgestellt hat:>quelle
Um es einfacher zu machen, werde ich sagen, dass Sie Ihre Schaltflächen wie folgt ändern können:
Ihr Controller:
quelle
Dieser Beitrag wird Coppermill nicht beantworten, da er vor langer Zeit beantwortet wurde. Mein Beitrag ist hilfreich für diejenigen, die nach einer solchen Lösung suchen. Zunächst muss ich sagen, dass "WDuffys Lösung völlig korrekt ist" und gut funktioniert, aber meine Lösung (nicht meine) wird in anderen Elementen verwendet und macht die Präsentationsschicht unabhängiger vom Controller (da Ihr Controller davon abhängt "Wert", der zum Anzeigen der Beschriftung der Schaltfläche verwendet wird. Diese Funktion ist für andere Sprachen wichtig.).
Hier ist meine Lösung, gib ihnen verschiedene Namen:
Und Sie müssen die Namen der Schaltflächen als Argumente in der folgenden Aktion angeben:
Wenn der Benutzer die Seite mit einer der Schaltflächen sendet, hat nur eines der Argumente einen Wert. Ich denke, das wird für andere hilfreich sein.
Aktualisieren
Diese Antwort ist ziemlich alt und ich überdenke meine Meinung tatsächlich. Vielleicht ist die obige Lösung gut für Situationen, in denen Parameter an die Eigenschaften des Modells übergeben werden. Machen Sie sich keine Sorgen und finden Sie die beste Lösung für Ihr Projekt.
quelle
input[type=submit]
Wert zurück, der ausgelöst wurde, sodass alle Modelle an eine Eigenschaft mit derselbenname
(z. B.action
) gebunden werden können . Anschließend können Sie Schaltflächen anhand dervalue
Zeichenfolge unterscheiden, ohne dass so viele Variablen in Ihre Signatur eingefügt werden müssen . Bitte nehmen Sie sich auch etwas Zeit, um vor dem Posten über Formatierung / Einrückung nachzudenken.Können Sie es mit Request.Form Collection nicht herausfinden? Wenn auf Prozess geklickt wird, ist das Anfrageformular ["Prozess"] nicht leer
quelle
Geben Sie beiden Schaltflächen den Namen und überprüfen Sie den Wert aus dem Formular.
Auf der Controllerseite:
quelle
In Core 2.2 Razor-Seiten funktioniert diese Syntax:
quelle
string submit
gegenüber dem Schreibenstring submit = Request.Form["Submit"];
. Einer der größten Vorteile von Razor Pages und / oder MVC ist die Lesbarkeit der Methoden, andernfalls könnte es sich um PHP handeln.