Przykładowy widok dodawania nowego stołu do gry wygląda nastepująco:
Jak widać, ustawiam w formularzu sporo parametrów. Załóżmy, że chcę ustalić regułę: parametr Miasto musi się składać z minimum 3 znaków i mogą to być tylko litery i spacje.
Skorzystam więc z paczki FluentValidation dostępnej przez nugeta.
Pełną dokumentację można znaleźć pod linkiem.
Przykład walidatora
Klasa walidatora GameTableValidator.cs wygląda następująco:
public class GameTableValidator : AbstractValidator<GameTableViewModel> { public GameTableValidator() { RuleFor(gameTable => gameTable.City) .MinimumLength(3).WithMessage("Miasto musi mieć minimum 3 znaki!") .Matches("^[a-zA-Z\\s]+$").WithMessage("Miasto musi się składać z liter!"); } }
A jej użycie w kontrolerze następująco:
public class GameTableController : Controller { private readonly GameTableValidator _gameTableValidator; public GameTableController() { _gameTableValidator = new GameTableValidator(); } [HttpPost] public JsonResult Add(GameTableViewModel model) { var results = _gameTableValidator.Validate(model); if (results.IsValid) { //Do logic return Json(null, JsonRequestBehavior.AllowGet); } var joinedErrors = string.Join(" ", results.Errors.Select(x => x.ErrorMessage).ToList()); return Json(joinedErrors, JsonRequestBehavior.AllowGet); } }
Nie wygląda to zbyt ładnie, ale mamy jakiś początek. W konstruktorze kontrolera tworzymy nowy obiekt walidatora. W metodzie Add korzystając z tego obiektu walidujemy model. Jeśli nie ma błędów (wartość IsValid to true), wykonujemy logikę. Jeśli są błędy, zwracamy je do widoku.
Jak to wygląda w praktyce?
Przypadek testowy 1
Dla danych (w polu Miasto wpisane a):
wyświetla się błąd:
Przypadek tes 2
Dla danych (w polu Miasto wpisane 1):
wyświetla się błąd:
Działa!
Skoro działa, to świetnie. W kolejnym wpisie pokażę, jak poprawić ten kod, żeby działał i wyglądał o wiele lepiej.
Hej,
chyba w definicji walidatora trafił Ci się błąd. Tam powinno być dziedziczenie po AbstractValidator, czyli generycznej wersji, aby później można było skorzystać w RuleFor z lamdami.
PolubieniePolubione przez 1 osoba
Faktycznie, umknął mi obiekt podczas kopiowania kodu. Już poprawiam. Dzięki za czujność!
PolubieniePolubienie
Pingback: FluentValidation – cz. 2 wzorzec fabryki – programmer-girl
Pingback: FluentValidation – cz. 3 testy i nullowalna properta – programmer-girl