Jedna forma dwa guziczki

Problem

Nie raz i nie dwa zdarzało mi się mieć potrzebę posiadania więcej niż jednego guzika na formie. Zawsze ale to zawsze miałem problem z tym jak to dobrze rozegrać. Aż wreszcie trafiłem na dobrą odpowiedź na SO.

Model i Forma

Załóżmy taki model danych, jakiś prosty viewmodel dla użytkownika.:

Następnie aby go przesłać z powrotem do kontrolera zdefiniowałem taki model:

Typ pola action jest także zdefiniowany.

Teraz gdzieś na widoku tworzę formę, która umożliwi mi wpisanie danych użytkownika. Chciałbym mieć także dwa guziki na tej formie, aby móc sterować formą, jednak zawsze chce trafić do tej samej metody, mogę to zrobić w taki sposób:

Klasyczna form z bootstrapem.

To co jest ważne to dwa guziki (@20 i @21), z przypisaną taką samą wartością dla atrybutu Name, ale z różnymi wartościami dla Value. Gdzie value jest przypisywane z FormAction. Już czujecie prostotę rozwiązania?

Akcja

Teraz sam kontroler:

W DTO sprawdzam wartość przypisaną do Action, jest osobne zachowanie dla FormAction.Next oraz FormAction.Prev.
Dla mnie ważne jest to, że nie muszę sprawdzać nigdzie dodatkowych stringów (o tym w ogóle kiedy indziej, ale o tym też mi się już zbiera), nie muszę posiadać osobnej metody lub jakichś pod-form z osobnymi specjalizowanymi guzikami czy coś. To rozwiązaniem jest moim zdaniem banalne, proste, czyste, piękne. Szkoda że sam na to nie wpadłem, tylko musiałem o tym gdzieś przeczytać.

Wsparcie

Sprawdziłem wsparcie przeglądarek i w momencie pisania działało to na IE10, Chrome 49.0.2623.110 m (64bit) oraz Firefox 45.0.1. Jak to będzie działać z legacy, nie wiem, ale aktualnie to nie moje zmartwienie. Cały projekt dostępny jest w tym repozytorium: https://jstadnicki@bitbucket.org/jstadnicki/jstadnicki-blog.git – projekt nazywa się MulitButton.

4 thoughts on “Jedna forma dwa guziczki

  1. W momencie kliknięcia przeglądarka wysyła formularz a w nim wartość tylko tego jednego klikniętego guziczka. Jest to normalne i poprawne działanie, które jest znane od lat, a więc o najstarsze wersje przeglądarek nie ma się co bać. Jedyne co mi się nie podoba to ten if, gdyż jedna akcja kontrolera nagle robi więcej, a nie tą jedną konkretną rzecz.

    Ja wolę rozwiązanie z JavaScriptem, który w zależności od guziczka podstawia url dla odpowiedniej akcji kontrolera. 🙂

    1. Każdy się uczy w swoim tempie. Co do ifa masz rację – ale nie znalazłem, nie skupiałem się jeszcze nad tym. Któryś z aspektów OOP pewnie sprytnie to załatwi 😉

  2. Pingback: dotnetomaniak.pl

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.