Czy istnieje jakiś prosty sposób obsługi wielu przycisków przesyłania z tego samego formularza? Na przykład:
<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" value="Send" />
<input type="submit" value="Cancel" />
<% Html.EndForm(); %>
Masz pomysł, jak to zrobić w programie ASP.NET Framework Beta? Wszystkie przykłady, w których szukałem Google, mają w sobie pojedyncze przyciski.
Odpowiedzi:
Oto najbardziej przejrzyste, oparte na atrybutach rozwiązanie problemu wielokrotnego przycisku przesyłania, oparte w dużej mierze na poście i komentarzach Maarten Balliauw .
brzytwa:
i kontroler:
Aktualizacja: strony Razor wyglądają tak, jakby zapewniały tę samą funkcjonalność po wyjęciu z pudełka. W przypadku nowego rozwoju może być preferowane.
źródło
return View(viewmodel)
w przypadku, gdy twój model zawiera błędy, spróbuje zwrócić widok o nazwieSend
lub w zależności od nazwy twojego argumentu.return View("Index", viewModel)
Nadaj przyciskom przesyłania nazwę, a następnie sprawdź przesłaną wartość w metodzie kontrolera:
wysyłanie do
EDYTOWAĆ:
Aby rozszerzyć to podejście do pracy ze zlokalizowanymi witrynami, odizoluj swoje wiadomości gdzie indziej (np. Kompilując plik zasobów do silnie typowanej klasy zasobów)
Następnie zmodyfikuj kod, aby działał jak:
a twój kontroler powinien wyglądać tak:
źródło
Możesz sprawdzić nazwę w akcji, jak już wspomniano, ale możesz rozważyć, czy jest to dobry projekt. Dobrym pomysłem jest wzięcie pod uwagę odpowiedzialności za działanie i niepowiązanie tego projektu zbytnio z aspektami interfejsu użytkownika, takimi jak nazwy przycisków. Rozważ więc użycie 2 formularzy i 2 akcji:
Ponadto w przypadku „Anuluj” zazwyczaj nie przetwarzasz formularza i przechodzisz do nowego adresu URL. W takim przypadku nie musisz wcale przesyłać formularza, wystarczy link:
źródło
Eilon sugeruje, że możesz to zrobić w następujący sposób:
Podoba mi się ta metoda, ponieważ nie opiera się ona na właściwości value przycisków przesyłania, która jest bardziej prawdopodobna do zmiany niż przypisane nazwy i nie wymaga włączenia javascript
Zobacz: http://forums.asp.net/p/1369617/2865166.aspx#2865166
źródło
Właśnie napisałem o tym: Wiele przycisków przesyłania za pomocą ASP.NET MVC :
Zasadniczo, zamiast używać
ActionMethodSelectorAttribute
, używamActionNameSelectorAttribute
, co pozwala mi udawać, że nazwa akcji jest taka, jaką chcę. Na szczęścieActionNameSelectorAttribute
nie tylko każe mi określać nazwę akcji, ale mogę wybrać, czy bieżąca akcja pasuje do żądania.Oto moja klasa (przy okazji nie przepadam za tym imieniem):
Aby użyć, wystarczy zdefiniować taki formularz:
i kontroler z dwiema metodami
Jak widać, ten atrybut wcale nie wymaga od ciebie niczego określenia. Ponadto nazwy przycisków są tłumaczone bezpośrednio na nazwy metod. Dodatkowo (nie próbowałem tego) powinny one również działać jako normalne akcje, więc możesz pisać bezpośrednio na dowolnym z nich.
źródło
submit
tagu z uwzględnieniem, który jest idealny, ponieważ jest to atrybut pure-UI, które powinny mieć żadnego wpływu na kontroli przepływu. Zamiast tego unikalnyname
atrybut każdegosubmit
znacznika przekłada się bezpośrednio na dyskretną metodę działania na kontrolerze.jest krótki i zawiera:
i zrób tak w kodzie
Powodzenia.
źródło
Proponuję zainteresowanym stronom zapoznać się z rozwiązaniem Maarten Balliauw . Myślę, że jest bardzo elegancki.
W przypadku, gdy link zniknie, używa
MultiButton
atrybutu zastosowanego do akcji kontrolera, aby wskazać, do którego przycisku należy się odnieść.źródło
Powinieneś być w stanie nazwać przyciski i nadać im wartość; następnie zamapuj tę nazwę jako argument akcji. Alternatywnie użyj 2 oddzielnych łączy akcji lub 2 formularzy.
źródło
Możesz napisać:
A następnie na stronie sprawdź, czy nazwa == „Wyślij” lub nazwa == „Anuluj” ...
źródło
W ActionSelectName nie podoba mi się to, że IsValidName jest wywoływana dla każdej metody akcji w kontrolerze; Nie wiem, dlaczego to działa w ten sposób. Lubię rozwiązanie, w którym każdy przycisk ma inną nazwę w zależności od tego, co robi, ale nie podoba mi się fakt, że musisz mieć tyle parametrów w metodzie akcji, co przyciski w formularzu. Utworzyłem wyliczenie dla wszystkich typów przycisków:
Zamiast ActionSelectName używam ActionFilter:
Filtr znajdzie nazwę przycisku w danych formularza i jeśli nazwa przycisku odpowiada dowolnemu typowi przycisku zdefiniowanemu w wyliczeniu, znajdzie parametr ButtonType wśród parametrów akcji:
a następnie w widokach mogę użyć:
źródło
Oto, co działa najlepiej dla mnie:
źródło
Natknąłem się również na ten „problem”, ale znalazłem dość logiczne rozwiązanie, dodając
name
atrybut. Nie mogłem sobie przypomnieć tego problemu w innych językach.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2
Oznacza to, że następujące
value
atrybuty kodu można zmieniać, lokalizować, internacjonalizować bez potrzeby dodatkowego sprawdzania kodu silnie typowanych plików zasobów lub stałych.Po stronie odbierającej wystarczy sprawdzić, czy któryś ze znanych typów przesyłania nie jest
null
źródło
Jeśli nie masz ograniczeń dotyczących używania HTML 5, możesz użyć
<button>
znacznika zformaction
atrybutem:Odniesienie: http://www.w3schools.com/html5/att_button_formaction.asp
źródło
Jeśli Twoja przeglądarka obsługuje formułowanie atrybutów dla przycisków wprowadzania (IE 10+, nie jestem pewien co do innych przeglądarek), powinny działać następujące czynności:
źródło
Istnieją trzy sposoby rozwiązania powyższego problemu
Poniżej znajduje się wideo, które podsumowuje wszystkie trzy podejścia w sposób demonstracyjny.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
Sposób HTML: -
W sposób HTML musimy utworzyć dwa formularze i umieścić przycisk „Prześlij” w każdym formularzu. I działanie każdej formy będzie wskazywać na różne / odpowiednie działania. Możesz zobaczyć poniższy kod, który pierwszy formularz publikuje w „Akcji 1”, a drugi formularz w „Akcji 2”, w zależności od kliknięcia przycisku „Prześlij”.
Sposób Ajax: -
Jeśli jesteś miłośnikiem Ajax, ta druga opcja bardziej Cię podnieci. W sposób Ajax możemy stworzyć dwie różne funkcje „Fun1” i „Fun1”, patrz poniższy kod. Te funkcje będą wykonywać wywołania Ajax przy użyciu JQUERY lub dowolnego innego frameworka. Każda z tych funkcji jest powiązana ze zdarzeniami „OnClick” przycisku „Prześlij”. Każda z tych funkcji wywołuje odpowiednie nazwy akcji.
Korzystanie z „ActionNameSelectorAttribute”: -
To świetna i czysta opcja. „ActionNameSelectorAttribute” to prosta klasa atrybutów, w której możemy napisać logikę decyzyjną, która zadecyduje, która akcja może zostać wykonana.
Pierwszą rzeczą jest to, że w HTML musimy nadać odpowiednie nazwy przyciskom przesyłania w celu ich identyfikacji na serwerze.
Widać, że umieściliśmy „Zapisz” i „Usuń” w nazwach przycisków. Możesz również zauważyć, że w akcji właśnie umieściliśmy nazwę kontrolera „Klient”, a nie konkretną nazwę akcji. Oczekujemy, że o nazwie akcji decyduje „ActionNameSelectorAttribute”.
Tak więc po kliknięciu przycisku wysyłania najpierw trafia on w atrybut „ActionNameSelector”, a następnie w zależności od tego, które polecenie zostało uruchomione, wywołuje odpowiednią akcję.
Pierwszym krokiem jest więc utworzenie klasy, która dziedziczy po klasie „ActionNameSelectorAttribute”. W tej klasie stworzyliśmy prostą właściwość „Nazwa”.
Musimy również zastąpić funkcję „IsValidName”, która zwraca true lub flase. Ta funkcja zapisuje logikę, czy akcja musi zostać wykonana, czy nie. Jeśli więc ta funkcja zwróci wartość true, akcja zostanie wykonana lub nie.
Głównym sercem powyższej funkcji jest poniższy kod. Kolekcja „ValueProvider” zawiera wszystkie dane wysłane z formularza. Najpierw sprawdza wartość „Nazwa” i jeśli zostanie znaleziona w żądaniu HTTP, zwraca wartość true lub w przeciwnym razie zwraca wartość false.
Tę klasę atrybutów można następnie udekorować odpowiednią akcją i podać odpowiednią wartość „Nazwa”. Więc jeśli przesłanie trafia w tę akcję i jeśli nazwa pasuje do nazwy przycisku HTML przesłania, wówczas wykonuje akcję dalej, w przeciwnym razie nie.
źródło
David Findley pisze o 3 różnych opcjach, które możesz zrobić, na swoim blogu ASP.Net.
Przeczytaj artykuł wiele przycisków w tej samej formie, aby zobaczyć jego rozwiązania oraz zalety i wady każdego z nich. IMHO zapewnia bardzo eleganckie rozwiązanie, które wykorzystuje atrybuty, którymi ozdobisz swoje działanie.
źródło
Jest to technika, której użyłbym i jeszcze jej nie widzę. Link (opublikowany przez Saajida Ismaila), który inspiruje to rozwiązanie, to http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form .aspx ). Dostosowuje odpowiedź Dylana Beattiego, aby bez problemu przeprowadzać lokalizację.
W widoku:
W kontrolerze:
źródło
<input>
elementów. Używam<button>
, co jest wymagane do przeprowadzenia lokalizacji bez posiadania atrybutów o zmiennej wartości.Ten skrypt pozwala określić atrybut data-form-action, który będzie działał jako atrybut formaction HTML5 we wszystkich przeglądarkach (w dyskretny sposób):
Formularz zawierający przycisk zostanie wysłany na adres URL określony w atrybucie data-form-action:
Wymaga to jQuery 1.7. W przypadku poprzednich wersji należy użyć
live()
zamiaston()
.źródło
Oto metoda rozszerzenia, którą napisałem, aby obsługiwać wiele przycisków obrazów i / lub tekstu.
Oto kod HTML przycisku graficznego:
lub w przypadku przycisku przesłania tekstu:
Oto metoda rozszerzenia, którą wywołujesz z kontrolera
form.GetSubmitButtonName()
. W przypadku przycisków obrazu szuka parametru formularza z.x
(który wskazuje, że kliknięto przycisk obrazu) i wyodrębnia nazwę. W przypadku zwykłychinput
przycisków szuka nazwy zaczynającej się od,Submit_
a następnie wydobywa polecenie. Ponieważ abstrahuję od logiki określania „polecenia”, możesz przełączać między przyciskami obraz + tekst na kliencie bez zmiany kodu po stronie serwera.Uwaga: w przypadku przycisków tekstowych musisz poprzedzić nazwę nazwą
Submit_
. Wolę tak, ponieważ oznacza to, że możesz zmienić wartość tekstu (wyświetlania) bez konieczności zmiany kodu. W przeciwieństwie doSELECT
elementówINPUT
przycisk ma tylko „wartość” i nie ma osobnego atrybutu „tekst”. Moje przyciski mówią różne rzeczy w różnych kontekstach - ale mapują na to samo „polecenie”. Wolę wyodrębnić nazwę w ten sposób niż kodować== "Add to cart"
.źródło
Nie mam wystarczającej liczby przedstawicieli, aby skomentować w odpowiednim miejscu, ale spędziłem nad tym cały dzień, więc chcę się tym podzielić.
Podczas próby wdrożenia rozwiązania „MultipleButtonAttribute”
ValueProvider.GetValue(keyValue)
niepoprawnie powrócinull
.Okazało się, że odwoływałem się do System.Web.MVC w wersji 3.0, kiedy powinien to być 4.0 (inne zestawy to 4.0). Nie wiem, dlaczego mój projekt nie zaktualizował się poprawnie i nie miałem innych oczywistych problemów.
Więc jeśli
ActionNameSelectorAttribute
nie działa ... sprawdź to.źródło
Jestem spóźniony na imprezę, ale proszę bardzo ... Moja implementacja pożycza od @mozozickiego, ale wymaga mniej zakodowanych ciągów, aby się pomylić. Wymagany Framework 4.5+ . Zasadniczo nazwa metody kontrolera powinna być kluczem do routingu.
Markup . Nazwa przycisku musi być wpisana za pomocą
"action:[controllerMethodName]"
(zawiadomienie korzystanie z C # 6 nameof API, zapewniając typu konkretne odniesienie do nazwy metody kontrolera, który chcesz wywołać.
Kontroler :
Atrybut Magia . Zwróć uwagę na
CallerMemberName
dobroć.źródło
źródło
Próbowałem dokonać syntezy wszystkich rozwiązań i stworzyłem atrybut [ButtenHandler], który ułatwia obsługę wielu przycisków w formularzu.
Opisałem to na CodeProject Wiele sparametryzowanych (zlokalizowanych) przycisków formularzy w ASP.NET MVC .
Aby obsłużyć prosty przypadek tego przycisku:
Będziesz miał coś w rodzaju następującej metody działania:
Zauważ, jak nazwa przycisku odpowiada nazwie metody akcji. W artykule opisano także, jak mieć przyciski z wartościami i przyciski z indeksami.
źródło
źródło
to najlepszy sposób, jaki znalazłem:
http://iwayneo.blogspot.co.uk/2013/10/aspnet-mvc-action-selector-with-list.html
Oto kod:
Ciesz się bez zapachu wieloma przyciskami przesyłania w przyszłości.
Dziękuję Ci
źródło
Zmodyfikowana wersja
HttpParamActionAttribute
metody, ale z poprawką błędu, która nie powoduje błędu w wygasających / nieprawidłowych zwrotach sesji. Aby sprawdzić, czy jest to problem z bieżącą witryną, otwórz formularz w oknie i tuż przed kliknięciemSave
lubPublish
otwórz zduplikowane okno i wyloguj się. Teraz wróć do pierwszego okna i spróbuj wysłać formularz za pomocą dowolnego przycisku. Dla mnie wystąpił błąd, więc ta zmiana rozwiązuje dla mnie ten problem. Pomijam kilka rzeczy ze względu na zwięzłość, ale powinieneś o tym pomyśleć. Kluczowymi częściami są włączenieActionName
atrybutu i upewnienie się, że przekazana nazwa jest nazwą Widoku, który pokazuje formularzKlasa atrybutu
Kontroler
Widok
źródło
Moje podejście do JQuery przy użyciu metody rozszerzenia:
Możesz użyć tego w następujący sposób:
I renderuje się tak:
źródło
Do każdego przycisku wysyłania wystarczy dodać:
źródło
Na podstawie odpowiedzi mkozickiego wpadam na nieco inne rozwiązanie. Nadal używam
ActionNameSelectorAttribute
Ale musiałem obsługiwać dwa przyciski „Zapisz” i „Synchronizuj”. Robią prawie to samo, więc nie chciałem mieć dwóch akcji.atrybut :
widok
kontroler
Chciałbym również zauważyć, że jeśli działania będą robić różne rzeczy, prawdopodobnie podążę za postem mkozickiego.
źródło
Utworzyliśmy ActionButton metodę HtmlHelper . Wygeneruje normalny przycisk wejściowy z odrobiną javascript w zdarzeniu OnClick , który prześle formularz do określonego kontrolera / akcji.
Tak używasz pomocnika
wygeneruje następujący kod HTML
Oto kod metody rozszerzenia:
VB.Net
C # (kod C # jest właśnie dekompilowany z biblioteki DLL VB, więc można uzyskać upiększenie ... ale czas jest tak krótki :-))
Te metody mają różne parametry, ale dla łatwości użycia możesz stworzyć przeciążenie, które zabierze tylko potrzebne parametry.
źródło