Utworzenie własnego atrybutu walidacji danych jest w ASP.NET MVC niezwykle banalne, szczególnie jeśli dziedziczymy z jakiegoś już istniejącego. Dla przykładu takie cacko pozwoli na wprowadzenie jedynie wartości czasu:
1: public class TimeSpanFormatAttribute : RegularExpressionAttribute 2: { 3: public TimeSpanFormatAttribute() 4: : base(@"^\d{2}:\d{2}:\d{2}$") 5: { 6: this.ErrorMessage = "Expected time in format HH:MM:SS"; 7: 8: } 9: }
Wystarczy zaaplikować w modelu i… już? Niestety nie. Owszem, server-side wszystko śmiga, jednak mi bardzo zależało na sprawdzeniu tego po stronie klienta.
Wraz ze znajomym zagłębiliśmy się każdy w swoją instancję Reflectora z załadowaną dllką MVC i po kilku nieudanych eksperymentach działającą walidację uzyskaliśmy dzięki jednemu prostemu dodatkowemu krokowi:
1: DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(TimeSpanFormatAttribute), typeof(RegularExpressionAttributeAdapter));
Taką rejestrację atrybutu umieszczamy w global.asax.Application_Start(), i to wszystko. Dokładnej ścieżki która nas do tego doprowadziła nie potrafię teraz odtworzyć, ale była zamotana i – jeśli bym ją tu umieszczał – prawdopodobnie tak nudna jak ta :).
Niby nic, ale jednak w “MVC 2 In Action” tego nie znalazłem (… a może słabo szukałem?).