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