Walidacja danych – podstawy

Oczekiwanie od użytkownika jakiegokolwiek programu, że będzie wprowadzał do niego wyłącznie poprawne dane jest, eufemistycznie rzecz ujmując, nierozważne:) Wiadomo, że taki bystry użytkownik bywa najlepszym testerem aplikacji, odkrywając sposoby na wygenerowanie błędu, które programiście często nawet nie zaświtają w głowie.

Ja również nie ufam zatem potencjalnym, przyszłym użytkownikom VodSearchera za grosz – i w związku z tym muszę skorzystać z mechanizmu walidacji wprowadzanych danych. Dziś krótkie wprowadzenie.

Najprostszym sposobem, by określić jakich danych spodziewamy się od użytkownika jest opatrzenie pól obiektów atrybutami, które to zdefiniują. Atrybuty walidacji stanowią jedną z podgrup Data Annotations i w takim właśnie namespace się znajdują. Tam gdzie to potrzebne dorzucamy więc dyrektywę:

using System.ComponentModel.DataAnnotations;

i możemy określić np:

[Required]
[MinLength(1), MaxLength(200)]
public string Title { get; set; }

Tytuł filmu jest wymagany i musi mieć długość między 1, a 200 znaków.

[Range(1887, 2050, ErrorMessage = "Wymagana wartość pomiędzy 1887 a 2050:)")]
public int ProductionYear { get; set; }

Rok produkcji natomiast musi zawierać się między 1887, a 2050. Widzimy tu dodatkowy parametr – ErrorMessage, czyli wiadomość, którą będziemy mogli wyświetlić użytkownikowi, jeśli wprowadzi błędne dane. Taką wiadomość wyświetlimy dodając w odpowiednim pliku widoku poniższe wywołanie:

@Html.ValidationMessageFor(model => model.ProductionYear, "", new { @class = "text-danger" })

Chcielibyśmy również, żeby każdy film był przypisany do przynajmniej jednego gatunku. Dodamy więc poniższe warunki:

[Required]
[MinLength(1)]
public int[] SelectedGenres { get; set; }

Jeśli nie zaznaczymy żadnego gatunku SelectedGenres będzie miało wartość null – MinLength nie zostanie wtedy wywołany! Dlatego jest tutaj dodatkowy atrybut Required. Spowoduje on jednak wyświetlenie wiadomości: „Pole SelectedGenres jest wymagane”, która nie do końca określa czego oczekujemy od użytkownika. Możemy jednak utworzyć własny atrybut i sami określić jak ma się zachować:

public class MinimumArraySizeAttribute : ValidationAttribute
{
    int _minLength;
    public MinimumArraySizeAttribute(int minLength)
    {
        _minLength = minLength;
    }
    public override bool IsValid(object value)
    {
        var list = value as Array;
        if (list != null)
        {
            return list.Length >= _minLength;
        }
        return false;
    }
}

Tak zdefiniowanym atrybutem możemy opatrzyć SelectedGenres i będzie on pilnował, żeby w tablicy był przynajmniej jeden element.

Marcin

Dodaj komentarz