Gibt es eine einfache Möglichkeit, mehrere Senden-Schaltflächen aus demselben Formular zu verarbeiten? Zum Beispiel:
<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" value="Send" />
<input type="submit" value="Cancel" />
<% Html.EndForm(); %>
Irgendeine Idee, wie dies in ASP.NET Framework Beta gemacht wird? Alle Beispiele, nach denen ich gegoogelt habe, enthalten einzelne Schaltflächen.
c#
html
asp.net-mvc
http-post
form-submit
Spoike
quelle
quelle
Antworten:
Hier ist eine größtenteils saubere, auf Attributen basierende Lösung für das Problem mit mehreren Senden- Schaltflächen, die stark auf dem Beitrag und den Kommentaren von Maarten Balliauw basiert .
Rasierer:
und Controller:
Update: Rasiermesserseiten bieten sofort die gleiche Funktionalität. Für Neuentwicklungen kann dies vorzuziehen sein.
quelle
return View(viewmodel)
in dem Fall, in dem Ihr Modell Fehler aufweist, eine aufgerufene Ansicht zurückzugeben,Send
je nachdem, wie Ihr Argumentname lautet.return View("Index", viewModel)
Geben Sie Ihren Senden-Schaltflächen einen Namen und überprüfen Sie den gesendeten Wert in Ihrer Controller-Methode:
Posting an
BEARBEITEN:
Um diesen Ansatz auf die Arbeit mit lokalisierten Sites auszudehnen, isolieren Sie Ihre Nachrichten an einer anderen Stelle (z. B. Kompilieren einer Ressourcendatei zu einer stark typisierten Ressourcenklasse).
Ändern Sie dann den Code so, dass er wie folgt funktioniert:
und Ihr Controller sollte folgendermaßen aussehen:
quelle
Sie können den Namen in der Aktion wie erwähnt überprüfen, aber Sie können überlegen, ob dies ein gutes Design ist oder nicht. Es ist eine gute Idee, die Verantwortung für die Aktion zu berücksichtigen und dieses Design nicht zu sehr mit UI-Aspekten wie Schaltflächennamen zu koppeln. Verwenden Sie also zwei Formulare und zwei Aktionen:
Außerdem verarbeiten Sie im Fall von "Abbrechen" das Formular normalerweise nicht und gehen zu einer neuen URL. In diesem Fall müssen Sie das Formular überhaupt nicht einreichen und benötigen lediglich einen Link:
quelle
Eilon schlägt vor, dass Sie es so machen können:
Ich mag diese Methode, da sie nicht auf der value-Eigenschaft der Submit-Schaltflächen beruht, die sich mit größerer Wahrscheinlichkeit ändert als die zugewiesenen Namen, und für die keine Aktivierung von Javascript erforderlich ist
Siehe: http://forums.asp.net/p/1369617/2865166.aspx#2865166
quelle
Habe gerade einen Beitrag dazu geschrieben: Mehrere Senden-Schaltflächen mit ASP.NET MVC :
Anstatt zu verwenden
ActionMethodSelectorAttribute
, verwende ich im Grunde genommen,ActionNameSelectorAttribute
wodurch ich so tun kann, als wäre der Aktionsname so, wie ich ihn haben möchte. GlücklicherweiseActionNameSelectorAttribute
muss ich nicht nur den Aktionsnamen angeben, sondern auch auswählen, ob die aktuelle Aktion mit der Anforderung übereinstimmt.Da ist also meine Klasse (übrigens mag ich den Namen nicht besonders):
Um zu verwenden, definieren Sie einfach ein Formular wie folgt:
und Controller mit zwei Methoden
Wie Sie sehen, müssen Sie für das Attribut überhaupt nichts angeben. Außerdem werden die Namen der Schaltflächen direkt in die Methodennamen übersetzt. Außerdem (das habe ich noch nicht ausprobiert) sollten diese Aktionen auch wie normale Aktionen funktionieren, sodass Sie direkt auf eine dieser Aktionen posten können.
quelle
submit
Tags wird nicht berücksichtigt, was ideal ist, da es sich um ein reines UI-Attribut handelt, das keinen Einfluss auf den Kontrollfluss haben sollte. Stattdessen wird das eindeutigename
Attribut jedessubmit
Tags direkt in eine diskrete Aktionsmethode auf Ihrem Controller übersetzt.es ist kurz und Suite:
und mache das im code behinde
Viel Glück.
quelle
Ich würde Interessenten vorschlagen, sich die Lösung von Maarten Balliauw anzusehen . Ich finde es sehr elegant.
Falls der Link verschwindet, wird der verwendet
MultiButton
Attribut, das auf eine Controller-Aktion angewendet wird, um anzugeben, auf welchen Schaltflächenklick sich diese Aktion beziehen soll.quelle
Sie sollten in der Lage sein, die Schaltflächen zu benennen und ihnen einen Wert zu geben. Ordnen Sie diesen Namen dann der Aktion als Argument zu. Alternativ können Sie 2 separate Aktionslinks oder 2 Formulare verwenden.
quelle
Sie könnten schreiben:
Und dann auf der Seite prüfen, ob der Name == "Senden" oder der Name == "Abbrechen" ...
quelle
Was ich an ActionSelectName nicht mag, ist, dass IsValidName für jede Aktionsmethode im Controller aufgerufen wird. Ich weiß nicht, warum es so funktioniert. Ich mag eine Lösung, bei der jede Schaltfläche einen anderen Namen hat, je nachdem, was sie tut, aber ich mag nicht die Tatsache, dass Sie so viele Parameter in der Aktionsmethode haben müssen wie Schaltflächen im Formular. Ich habe eine Aufzählung für alle Schaltflächentypen erstellt:
Anstelle von ActionSelectName verwende ich einen ActionFilter:
Der Filter findet den Schaltflächennamen in den Formulardaten. Wenn der Schaltflächenname mit einem der in der Aufzählung definierten Schaltflächentypen übereinstimmt, findet er den ButtonType-Parameter unter den Aktionsparametern:
und dann in Ansichten kann ich verwenden:
quelle
Folgendes funktioniert für mich am besten:
quelle
Ich bin auch auf dieses 'Problem' gestoßen, habe aber durch Hinzufügen des
name
Attributs eine ziemlich logische Lösung gefunden . Ich konnte mich nicht erinnern, dieses Problem in anderen Sprachen gehabt zu haben.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2
Dies bedeutet, dass die folgenden Codeattribute
value
geändert, lokalisiert und internationalisiert werden können, ohne dass zusätzlicher Code für stark typisierte Ressourcendateien oder Konstanten erforderlich ist.Auf der Empfängerseite müssten Sie nur prüfen, ob einer Ihrer bekannten Übermittlungstypen dies nicht ist
null
quelle
Wenn Sie keine Einschränkungen für die Verwendung von HTML 5 haben, können Sie das
<button>
Tag mitformaction
Attribut verwenden:Referenz: http://www.w3schools.com/html5/att_button_formaction.asp
quelle
Wenn Ihr Browser die Attributformatierung für Eingabeschaltflächen unterstützt (IE 10+, bei anderen Browsern nicht sicher), sollte Folgendes funktionieren:
quelle
Es gibt drei Möglichkeiten, wie Sie das oben genannte Problem lösen können
Im Folgenden finden Sie ein Video, in dem alle drei Ansätze demonstrativ zusammengefasst sind.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
HTML-Weg: -
Auf HTML-Weise müssen wir zwei Formulare erstellen und die Schaltfläche "Senden" in jedem der Formulare platzieren. Und die Aktion jedes Formulars zeigt auf unterschiedliche / entsprechende Aktionen. Sie können den folgenden Code sehen, den das erste Formular an "Aktion1" sendet, und das zweite Formular wird an "Aktion2" gesendet, je nachdem, auf welche Schaltfläche "Senden" geklickt wird.
Ajax Weg: -
Wenn Sie ein Ajax-Liebhaber sind, würde Sie diese zweite Option mehr begeistern. Auf Ajax-Weise können wir zwei verschiedene Funktionen "Fun1" und "Fun1" erstellen, siehe den folgenden Code. Diese Funktionen führen Ajax-Aufrufe mithilfe von JQUERY oder einem anderen Framework durch. Jede dieser Funktionen ist mit den "OnClick" -Ereignissen der Schaltfläche "Senden" verknüpft. Jede dieser Funktionen ruft die jeweiligen Aktionsnamen auf.
Verwenden von "ActionNameSelectorAttribute": -
Dies ist eine großartige und saubere Option. Das "ActionNameSelectorAttribute" ist eine einfache Attributklasse, in der wir eine Entscheidungslogik schreiben können, die entscheidet, welche Aktion ausgeführt werden kann.
Als erstes müssen wir in HTML den Senden-Schaltflächen die richtigen Namen geben, um sie auf dem Server zu identifizieren.
Sie können sehen, dass wir den Schaltflächennamen "Speichern" und "Löschen" hinzugefügt haben. Außerdem können Sie in der Aktion feststellen, dass wir gerade den Controller-Namen "Kunde" und nicht einen bestimmten Aktionsnamen eingegeben haben. Wir erwarten, dass der Aktionsname von "ActionNameSelectorAttribute" bestimmt wird.
Wenn Sie also auf die Schaltfläche "Senden" klicken, wird zuerst das Attribut "ActionNameSelector" aufgerufen, und je nachdem, welche Übermittlung ausgelöst wird, wird die entsprechende Aktion aufgerufen.
Der erste Schritt besteht also darin, eine Klasse zu erstellen, die von der Klasse "ActionNameSelectorAttribute" erbt. In dieser Klasse haben wir eine einfache Eigenschaft "Name" erstellt.
Wir müssen auch die Funktion "IsValidName" überschreiben, die true oder flase zurückgibt. In dieser Funktion schreiben wir die Logik, ob eine Aktion ausgeführt werden muss oder nicht. Wenn diese Funktion also true zurückgibt, wird die Aktion ausgeführt oder nicht.
Das Hauptherz der obigen Funktion befindet sich im folgenden Code. Die Sammlung "ValueProvider" enthält alle Daten, die aus dem Formular gebucht wurden. Daher wird zuerst der Wert "Name" nachgeschlagen, und wenn er in der HTTP-Anforderung gefunden wird, wird "true" oder "false" zurückgegeben.
Diese Attributklasse kann dann für die jeweilige Aktion dekoriert und der jeweilige Wert "Name" angegeben werden. Wenn der Submit diese Aktion ausführt und der Name mit dem Namen der HTML-Submit-Schaltfläche übereinstimmt, führt er die Aktion weiter aus oder nicht.
quelle
David Findley schreibt in seinem ASP.Net-Weblog über drei verschiedene Optionen, die Sie dazu haben.
Lesen Sie im Artikel mehrere Schaltflächen in derselben Form , um seine Lösungen sowie deren Vor- und Nachteile zu sehen. IMHO bietet er eine sehr elegante Lösung, die Attribute verwendet, mit denen Sie Ihre Aktion dekorieren.
quelle
Dies ist die Technik, die ich verwenden würde und die ich hier noch nicht sehe. Der Link (gepostet von Saajid Ismail), der diese Lösung inspiriert, lautet http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form .aspx ). Es passt Dylan Beatties Antwort an, um die Lokalisierung ohne Probleme durchzuführen.
In der Ansicht:
In der Steuerung:
quelle
<input>
Elemente. Ich benutze<button>
, was erforderlich ist, um die Lokalisierung ohne variable Wertattribute durchzuführen.Mit diesem Skript können Sie ein Datenformular-Aktionsattribut angeben, das in allen Browsern (auf unauffällige Weise) als HTML5-Formatierungsattribut fungiert:
Das Formular mit der Schaltfläche wird an die URL gesendet, die im Attribut data-form-action angegeben ist:
Dies erfordert jQuery 1.7. Für frühere Versionen sollten Sie
live()
anstelle von verwendenon()
.quelle
Hier ist eine Erweiterungsmethode, die ich geschrieben habe, um mehrere Bild- und / oder Textschaltflächen zu verarbeiten.
Hier ist der HTML-Code für eine Bildschaltfläche:
oder für eine Text-Senden-Schaltfläche:
Hier ist die Erweiterungsmethode, mit der Sie vom Controller aufrufen
form.GetSubmitButtonName()
. Bei Bildschaltflächen wird nach einem Formularparameter mit gesucht.x
(der angibt, dass auf eine Bildschaltfläche geklickt wurde) und der Name extrahiert. Bei normaleninput
Schaltflächen wird nach einem Namen gesucht, der mit beginnt,Submit_
und der Befehl wird anschließend extrahiert. Da ich die Logik zur Bestimmung des 'Befehls' abstrahiere, können Sie auf dem Client zwischen Bild- und Textschaltflächen wechseln, ohne den serverseitigen Code zu ändern.Hinweis: Für Textschaltflächen müssen Sie dem Namen ein Präfix voranstellen
Submit_
. Ich bevorzuge diesen Weg, weil es bedeutet, dass Sie den Textwert (Anzeigewert) ändern können, ohne den Code ändern zu müssen. Im Gegensatz zuSELECT
Elementen hat eineINPUT
Schaltfläche nur einen 'Wert' und kein separates 'Text'-Attribut. Meine Schaltflächen sagen verschiedene Dinge in unterschiedlichen Kontexten aus - sind aber demselben 'Befehl' zugeordnet. Ich extrahiere den Namen lieber auf diese Weise als codieren zu müssen== "Add to cart"
.quelle
Ich habe nicht genug Repräsentanten, um an der richtigen Stelle zu kommentieren, aber ich habe den ganzen Tag damit verbracht, also möchte ich teilen.
Beim Versuch, die "MultipleButtonAttribute" -Lösung zu implementieren,
ValueProvider.GetValue(keyValue)
würde dies fälschlicherweise wieder auftretennull
.Es stellte sich heraus, dass ich auf System.Web.MVC Version 3.0 verwies, als es 4.0 hätte sein sollen (andere Assemblys sind 4.0). Ich weiß nicht, warum mein Projekt nicht richtig aktualisiert wurde und ich hatte keine anderen offensichtlichen Probleme.
Also, wenn Ihr
ActionNameSelectorAttribute
nicht funktioniert ... überprüfen Sie das.quelle
Ich bin ziemlich spät zur Party, aber hier ist es ... Meine Implementierung leiht sich von @mkozicki aus, erfordert aber weniger fest codierte Zeichenfolgen, um falsch zu liegen. Framework 4.5+ erforderlich . Im Wesentlichen sollte der Name der Controller-Methode der Schlüssel zum Routing sein.
Markup . Der Schaltflächenname muss mit verschlüsselt sein
"action:[controllerMethodName]"
( Beachten Sie die Verwendung des C # 6- Namens der API, die einen typspezifischen Verweis auf den Namen der Controller-Methode enthält, die Sie aufrufen möchten.
Controller :
Attribut Magie . Beachten Sie die Verwendung von
CallerMemberName
Güte.quelle
quelle
Ich habe versucht, eine Synthese aller Lösungen zu erstellen, und ein [ButtenHandler] -Attribut erstellt, mit dem mehrere Schaltflächen in einem Formular einfach verarbeitet werden können.
Ich habe es in CodeProject beschrieben. Mehrere parametrisierte (lokalisierbare) Formularschaltflächen in ASP.NET MVC .
So behandeln Sie den einfachen Fall dieser Schaltfläche:
Sie haben so etwas wie die folgende Aktionsmethode:
Beachten Sie, wie der Name der Schaltfläche mit dem Namen der Aktionsmethode übereinstimmt. Der Artikel beschreibt auch, wie Schaltflächen mit Werten und Schaltflächen mit Indizes vorhanden sind.
quelle
quelle
Dies ist der beste Weg, den ich gefunden habe:
http://iwayneo.blogspot.co.uk/2013/10/aspnet-mvc-action-selector-with-list.html
Hier ist der Code:
Genießen Sie eine Zukunft ohne Code-Geruch ohne Multi-Submit-Button.
Vielen Dank
quelle
Geänderte Version der
HttpParamActionAttribute
Methode, jedoch mit einer Fehlerbehebung, die bei abgelaufenen / ungültigen Sitzungspostbacks keinen Fehler verursacht. Um festzustellen, ob dies ein Problem mit Ihrer aktuellen Site ist, öffnen Sie das Formular in einem Fenster und kurz bevor Sie aufSave
oder klickenPublish
, öffnen Sie ein doppeltes Fenster und melden Sie sich ab. Kehren Sie nun zu Ihrem ersten Fenster zurück und versuchen Sie, Ihr Formular mit einer der beiden Schaltflächen zu senden. Für mich ist ein Fehler aufgetreten, daher löst diese Änderung das Problem für mich. Der Kürze halber lasse ich ein paar Sachen weg, aber Sie sollten auf die Idee kommen. Die wichtigsten Teile sind die Einbeziehung vonActionName
in das Attribut und die Sicherstellung, dass der übergebene Name der Name der Ansicht ist, in der das Formular angezeigt wirdAttributklasse
Regler
Aussicht
quelle
Mein JQuery-Ansatz mit einer Erweiterungsmethode:
Sie können es so verwenden:
Und es macht so:
quelle
Fügen Sie für jede Senden-Schaltfläche einfach Folgendes hinzu:
quelle
Basierend auf der Antwort von mkozicki habe ich eine etwas andere Lösung gefunden. Ich benutze immer noch
ActionNameSelectorAttribute
Aber ich musste zwei Schaltflächen 'Speichern' und 'Synchronisieren' handhaben. Sie machen fast das gleiche, also wollte ich nicht zwei Aktionen haben.Attribut :
Aussicht
Regler
Ich möchte auch darauf hinweisen, dass ich, wenn Aktionen andere Dinge tun, wahrscheinlich dem Beitrag von mkozicki folgen würde.
quelle
Ich habe eine ActionButton- Methode für den HtmlHelper erstellt . Es wird mit einem wenig normalen Eingabeknopf erzeugt Javascript in dem Ereignisse OnClick , das das Formular mit der angegebenen Controller / Aktion vorlegen wird.
Sie benutzen den Helfer so
Dadurch wird der folgende HTML-Code generiert
Hier ist der Code der Erweiterungsmethode:
VB.Net
C # (der C # -Code wird nur aus der VB-DLL dekompiliert, damit er etwas verschönert werden kann ... aber die Zeit ist so kurz :-))
Diese Methoden haben verschiedene Parameter, aber zur Vereinfachung der Verwendung können Sie eine Überlastung erzeugen, die nur die Parameter verwendet, die Sie benötigen.
quelle