poniedziałek, 1 kwietnia 2013

Walidacja ASP.NET MVC 4

O walidacji pisałem już wcześniej w kursie o ASP.NET MVC 2.
W wersji trzeciej i czwartej dodano nowe możliwości walidacji o których napiszę w tym poście.


1. Atrybuty
Atrybuty opisywałem w przypadku wersji drugiej ASP.NET MVC - nie będę więc powielał już napisanego tekstu.
Dla przypomnienia tylko w jaki sposób je dodajemy do naszego modelu:

Code:
        [StringLength(50)]
        public string FirstName { get; set; }

Dodano nowe atrybuty, wśród nich m.in: EmailAddress, Url, CreditCard, Phone, Remote, Display, DisplayFormat.

Ostatni atrybut - Remote pozwala na napisanie kodu, który wykonuje walidację po stronie serwera bez potrzeby wysyłania całego formularza do serwera. Bardzo dobry przykład ilustrujący zastosowanie tego atrybutu można znaleźć w msdn http://msdn.microsoft.com/en-us/library/gg508808%28v=vs.98%29.aspx


2. Napisanie własnego atrybutu walidacji
Jeżeli kilka właściwości w modelu wymaga tego samego sposobu walidacji, można go zamknąć w atrybucie dziedziczącym po klasie ValidationAttribute:

Code:
    public class CustomValidationAttribute : ValidationAttribute
    {
        public CustomValidationAttribute() : base("{0} is not valid")
        {
            
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            //Validacja

            return ValidationResult.Success;
        }
    }

W naszej klasie nadpisujemy metodę IsValid i umieszczamy w niej kod odpowiedzialny za walidację wartości. w przypadku powodzenia zwracamy wartość Success, w innym przypadku zwracamy obiekt ValidationResult z wiadomością błędu.


3. Interfejs IValidatableObject
Zaletą tego rozwiązania jest to, że mamy dostęp do całego obiektu modelu w momencie przeprowadzania walidacji. W przypadku atrybutów możemy przeprowadzić walidację więcej niż jednego pola na raz, jednak korzystając z interfejsu IValidatableObject jest to o wiele prostsze.
Przykład:

Code:
    public class ApplicationUser : IEditModel, IValidatableObject
    {
        public int Id { get; set; }

        [StringLength(50)]
        public string FirstName { get; set; }

        public string LastName { get; set; }
        public bool SecretField { get; set; }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (FirstName.Length > 30 && LastName.Length > 30)
            {
                yield return new ValidationResult("Something is wrong...");
            }
        }
    }

Brak komentarzy:

Prześlij komentarz