2010-09-02 8 views
19

Aby utrzymać czystość modelu, chciałbym zaimplementować własne atrybuty sprawdzania poprawności, takie jak PhoneNumberAttribute i EmailAttribute. Niektóre z nich można korzystnie zaimplementować jako proste klasy dziedziczące po RegularExpressionAttribute.Sprawdzanie poprawności strony ASP.NET MVC po stronie klienta z odziedziczonym atrybutem RegularExpressionAttribute

Jednak zauważyłem, że robienie tego łamie walidację tych atrybutów po stronie klienta. Zakładam, że istnieje jakiś rodzaj wiązania, które gdzieś zawodzi.

Jakieś pomysły, co mogę zrobić, aby sprawdzenie poprawności strony klienta zadziałało?

przykład kod:

public sealed class MailAddressAttribute : RegularExpressionAttribute 
{ 
    public MailAddressAttribute() 
     : base(@"^[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}$") 
    { 
    } 
} 
+0

Ale to RegularExpressionAttribute i ma wyrażenia regularnego, co działa dobrze, jeśli jest wyraźnie zdefiniowane w modelu. – zidar

+0

Dokładnie to, co miałem zadać – TWith2Sugars

Odpowiedz

26

Musisz zarejestrować adapter walidacji po stronie klienta dla atrybutu niestandardowego. W takim przypadku można użyć istniejącego elementu RegularExpressionAttributeAdapter w System.Web.Mvc, ponieważ powinien on działać dokładnie tak samo, jak standardowy atrybut regex. Następnie zarejestrować go, gdy zaczynają swoją aplikację korzystającą:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(MailAddressAttribute), 
    typeof(RegularExpressionAttributeAdapter)); 

trzeba napisać atrybut, który wymaga niestandardowego sprawdzania poprawności po stronie klienta, można zaimplementować własną kartę przez dziedziczenie z DataAnnotationsModelValidator (patrz także Phil Haack's blog).

+1

Dokładnie to, czego szukałem, dzięki. – zidar

+0

Jak zarejestrować adapter z miejsca, w którym zdefiniowałem atrybut. Ta implementacja wymaga znajomości atrybutów. Nie mogę przekazać DLL innemu programistce i poprosić o korzystanie z atrybutów. Powinienem też poprosić go o dodanie kodu do jego pliku asax. Czy jest więcej mniej sprzężonej drogi? – Cherven

9

wydłużenie właściwą odpowiedź

public class EmailAttribute : RegularExpressionAttribute 
{ 
    static EmailAttribute() 
    { 
     DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute), typeof(RegularExpressionAttributeAdapter)); 
    } 

    public EmailAttribute() 
     : base(@"^[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$") //^[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$ 
    { 

    } 
} 
+0

Z jakiegoś powodu, mimo że wywołano konstruktor statyczny, nie generował on znaczników sprawdzania poprawności strony klienta. Dodałem więc rejestrację do 'Application_Start()', w 'Global.asax'. –