Wątek przeniesiony 2020-11-23 19:53 z C# i .NET przez Patryk27.

W jakim miejscu powinna być tego typu walidacja

0

Cześć, zastanawiam się gdzie powinna być walidacja którą opiszę poniżej.

Załóżmy że mamy formularz tworzenia piłkarza. W tym formularzu w dropdown są do wyboru pozycje na jakim może grać piłkarz. Pozycje te są zdefiniowane w bazie danych. Wiadomo że jakiś cwaniak mógłby za pomocą JS wysłać na serwer pozycje piłkarza które nie istnieją. Chciałbym walidować te dane, aby w takiej sytuacji serwer nie pozwolił na to. W jakim miejscu powinienem sprawdzać istnienie danej pozycji? W kontrolerze? Pobrać z serwisu wszystkie pozycje i sprawdzić czy zwrócona kolekcja zawiera daną pozycję? Może gdzieś dalej w aplikacji?
Czyli kontroler wysyła żądanie stworzenia piłkarza, a serwis odpowiada że tworzenie zakończone błędem?

Jak waszym zdaniem powinienem to rozwiązać?

2

W kontrolerze?

Nie.

Zrób tak, aby Ci się wygodnie to testowało, więc np. w tym service/handlerze czy jak to tam zwiesz.

Jeżeli widzisz że musisz dużo gimnastyki popełnić aby napisać taki prosty teścik "corowych" założeń projektu, to jest to wskazówka że coś może być nie tak :P

2

A potrzebujesz te pozycję pobierać z bazy danych? Bo mi to raczej wygląda na enum który możesz walidowac w kontrolerze. IMO im wcześniejsza walidacja tym lepiej.

2

Zależy co chcesz osiągnąć. Jeśli te wybory są zdefiniowane z góry to możesz je walidować dynamicznie po stronie klienta i w kontrolerze (lista albo enum).
Jeśli chcesz mieć możliwość dodawania nowych to dodaj osobny kontroler i trzymaj te kategorie w innej tabeli. Może nie jest to optymalne rozwiązanie, ale powinno działać.

4

Przede wszystkim - tak, taka walidacja powinna się odbywać zawsze po stronie serwera i nie należy z niej rezygnować. Jeśli robisz dodatkowo walidację po stronie klienta - to jedynie dla wygody użytkownika.

Kontroler - według nazewnictwa w aplikacjach webowych, gdzie masz klasy w stylu XYZController powiązane z żądaniami HTTP na zasobie XYZ / ścieżce /xyz - jedynie spina zewnętrzny interfejs aplikacji (czyli np. serwer HTTP obsługujący żądania) z jej właściwą funkcją. Dlatego prawie zawsze jest to bardzo, bardzo kiepskie miejsce na taką walidację - pomijając kwestię mieszania ze sobą różnych odpowiedzialności zakładam, że chcesz aby aplikacja sprawdzała czy np. pozycja piłkarza jest dozwolona zawsze, a nie tylko wtedy gdy użytkownik zmieni pozycję przez jeden konkretny endpoint, który to sprawdza?

4

Zróbmy prosty eksperyment myślowy:
Co jeśli endpoint jest SOAPowy, ale stwierdzasz że 21 wiek i pora na zmianę na RESTa?
Będziesz kopiował walidację?

0

@superdurszlak:

zakładam, że chcesz aby aplikacja sprawdzała czy np. pozycja piłkarza jest dozwolona zawsze, a nie tylko wtedy gdy użytkownik zmieni pozycję przez jeden konkretny endpoint, który to sprawdza?

Zgadza się. To ma być sprawdzane przy wielu operacjach. M.in stworzenie piłkarza, edytowanie jego danych itp.

1

Skoro to .Net to najłatwiej ten konkretny problem rozwiązać Enumem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1