[ Pobierz całość w formacie PDF ]
.";}public override bool IsValid(object value) {return !string.IsNullOrEmpty((string)value) &&emailRegex.IsMatch((string)value);}}Jest to podejście takie same jak w przypadku tworzenia atrybutów kontroli poprawności po stronie serwera,które przedstawialiśmy we wcześniejszej części rozdziału.Tworzymy klasę dziedziczącą po ValidationAttributei zmieniamy metodę IsValid, w której umieszczamy naszą logikę kontroli poprawności.Uwaga Aby zachowa prostot , w przyk adzie tym u yli my bardzo prostego wyra enia regularnego do kontroliadresu e-mail.W sieci mo na atwo znale bardziej zaawansowane wzorce.Aby umożliwić działanie kontroli poprawności po stronie klienta, musimy zaimplementować interfejsIClientValidatable, zamieszczony na listingu 18.28.Listing 18.28.Interfejs IClientValidatablepublic interface IClientValidatable {IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context);}Interfejs ten definiuje jedną metodę, GetClientValidationRules, która zwraca listę obiektówModelClientValidationRule.Każdy obiekt ModelClientValidationRule opisuje zasadę kontroli poprawnościpo stronie klienta, jaką należy zastosować, komunikat o błędzie wyświetlany w przypadku złamania tej zasadyoraz wszystkie inne parametry wymagane do jej działania.Na listingu 18.29 zamieszczony jest kod ilustrującysposób dodania kontroli poprawności po stronie klienta w klasie EmailAddressAttribute z listingu 18.27.Listing 18.29.Dodanie obsługi strony klienckiej w klasie EmailAddressAttributepublic class EmailAddressAttribute : ValidationAttribute, IClientValidatable {private static readonly Regex emailRegex = new Regex(".+@.+\\.+");public EmailAddressAttribute() {508Pole ksi kKup ksi kROZDZIA 18.KONTROLA POPRAWNO CI MODELUErrorMessage = "Podaj prawid owy adres e-mail.";}public override bool IsValid(object value) {return !string.IsNullOrEmpty((string)value) &&emailRegex.IsMatch((string)value);}public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {return new List {new ModelClientValidationRule {ValidationType = "email",ErrorMessage = this.ErrorMessage},new ModelClientValidationRule {ValidationType = "required",ErrorMessage = this.ErrorMessage}};}}Możemy zwrócić tyle obiektów ModelClientValidationRule potrzebnych do zdefiniowania zbioru zasadpo stronie klienta, ile potrzeba do wymuszenia naszych zasad poprawności.W przedstawionym przykładzieużyliśmy zasad email oraz required (ustawiając właściwość ValidationType w obiekcie ModelClientValidationRule),które korzystają z komunikatu o błędzie zdefiniowanego w atrybucie (za pomocą właściwości ErrorMessage).Nasz nowy atrybut możemy przypisać do klasy modelu identycznie jak każdy inny atrybut kontroli poprawności:public class Appointment {[EmailAddress]public string ClientName { get; set; }.Gdy tworzony jest edytor dla właściwości ClientName, silnik widoku analizuje użyte przez nas metadane,wyszukuje naszą implementację IClientValidatable i generuje atrybuty HTML przedstawione w poprzednimpunkcie.Przesłane dane są ponownie sprawdzane za pomocą naszej metody IsValid.Nasz nowy atrybut jestużywany do kontroli poprawności zarówno na serwerze, jak i na kliencie, co jest przyjemniejsze, bezpieczniejszei bardziej spójne niż jawne generowanie atrybutów HTML.Tworzenie w asnych zasad poprawno ci na klienciePrzedstawione w tabeli 18.5 wbudowane zasady kontroli poprawności na kliencie są użyteczne, ale nie wyczerpująwszystkich możliwości.Na szczęście możesz przygotować własne zasady, jeżeli jesteś w stanie napisać kilkawierszy kodu JavaScript.Obsługa kontroli poprawności na kliencie jest ograniczona w bibliotece MVC do zasad dostępnych w bazowejbibliotece jQuery.Sprowadza się to do tego, że możemy dostosowywać istniejące zasady na wiele sposobów,ale jeżeli chcemy utworzyć coś bardziej skomplikowanego, musimy zostawić wbudowaną obsługę kontrolipoprawności z MVC i operować bezpośrednio na jQuery.Mimo że mamy narzucone ograniczenie, możemytworzyć nowe, użyteczne mechanizmy.Na przykład funkcje kontroli poprawności bazujące na kliencie nie obsługują pól wyboru w sposób prawidłowy,podobnie jak przedstawione wcześniej atrybuty kontroli poprawności na serwerze.Możemy utworzyć nową,kliencką zasadę poprawności, która będzie korzystała z zasady jQuery rule dla pól wyboru, jak pokazanona listingu 18.30.509Pole ksi kKup ksi kCZ II ASP.NET MVC 3 SZCZEG� OWY OPISListing 18.30.Tworzenie własnego odwzorowania pomiędzy funkcjami kontroli poprawności w MVC i jQuery@ViewBag.TitlejQuery.validator.unobtrusive.adapters.add("checkboxtrue", function (options) {if (options.element.tagName.toUpperCase() == "INPUT" &&options.element.type.toUpperCase() == "CHECKBOX") {options.rules["required"] = true;if (options.message) {options.messages["required"] = options.message;}}});@RenderBody()Utworzyliśmy tu nową zasadę o nazwie checkboxtrue, która za pomocą zasady required z jQueryValidation ma za zadanie sprawdzić, czy pole wyboru jest zaznaczone.Skrypt ten dodaliśmy do pliku układuw projekcie (_Layout.cshtml), dzięki czemu jest on dostępny we wszystkich widokach.Uwaga Dodawanie nowych zasad kontroli poprawno ci jest zaawansowanym procesem, który wymaga dobrejznajomo ci biblioteki jQuery Validation oraz obs ugi kontroli poprawno ci po stronie klienta z biblioteki MVC.Nie b dziemy wyja nia , jak dzia a skrypt z listingu 18.29, ale je eli chcesz nauczy si dodawa nowe zasadypoprawno ci, to na pocz tek warto zapozna si z kodem ród owym z pliku jQuery.validate.unobtrusive.js.Po utworzeniu klienckiej zasady poprawności możemy utworzyć korzystający z niej atrybut.We wcześniejszejczęści rozdziału pokazaliśmy, jak utworzyć serwerowy atrybut kontroli poprawności, który pozwala upewnićsię, że pole wyboru jest zaznaczone.Na listingu 18.29 rozszerzyliśmy tę klasę atrybutu o obsługę strony klienckiej,wykorzystując zasadę checkboxtrue z listingu 18.31.Listing 18.31.Dodanie kontroli poprawności po stronie klienckiej w klasie MustBeTrueAttributepublic class MustBeTrueAttribute : ValidationAttribute, IClientValidatable {public override bool IsValid(object value) {return value is bool && (bool)value;510Pole ksi kKup ksi kROZDZIA 18.KONTROLA POPRAWNO CI MODELU}public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {return new ModelClientValidationRule[] {new ModelClientValidationRule {ValidationType = "checkboxtrue",ErrorMessage = this.ErrorMessage}};}}Teraz możemy korzystać z atrybutu MustBeTrue dla właściwości typu bool w klasach modelu, dzięki czemuupewnimy się, że użytkownik zaznaczy pole wyboru przed przesłaniem danych na serwer [ Pobierz całość w formacie PDF ]
zanotowane.pl doc.pisz.pl pdf.pisz.pl milosnikstop.keep.pl
.";}public override bool IsValid(object value) {return !string.IsNullOrEmpty((string)value) &&emailRegex.IsMatch((string)value);}}Jest to podejście takie same jak w przypadku tworzenia atrybutów kontroli poprawności po stronie serwera,które przedstawialiśmy we wcześniejszej części rozdziału.Tworzymy klasę dziedziczącą po ValidationAttributei zmieniamy metodę IsValid, w której umieszczamy naszą logikę kontroli poprawności.Uwaga Aby zachowa prostot , w przyk adzie tym u yli my bardzo prostego wyra enia regularnego do kontroliadresu e-mail.W sieci mo na atwo znale bardziej zaawansowane wzorce.Aby umożliwić działanie kontroli poprawności po stronie klienta, musimy zaimplementować interfejsIClientValidatable, zamieszczony na listingu 18.28.Listing 18.28.Interfejs IClientValidatablepublic interface IClientValidatable {IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context);}Interfejs ten definiuje jedną metodę, GetClientValidationRules, która zwraca listę obiektówModelClientValidationRule.Każdy obiekt ModelClientValidationRule opisuje zasadę kontroli poprawnościpo stronie klienta, jaką należy zastosować, komunikat o błędzie wyświetlany w przypadku złamania tej zasadyoraz wszystkie inne parametry wymagane do jej działania.Na listingu 18.29 zamieszczony jest kod ilustrującysposób dodania kontroli poprawności po stronie klienta w klasie EmailAddressAttribute z listingu 18.27.Listing 18.29.Dodanie obsługi strony klienckiej w klasie EmailAddressAttributepublic class EmailAddressAttribute : ValidationAttribute, IClientValidatable {private static readonly Regex emailRegex = new Regex(".+@.+\\.+");public EmailAddressAttribute() {508Pole ksi kKup ksi kROZDZIA 18.KONTROLA POPRAWNO CI MODELUErrorMessage = "Podaj prawid owy adres e-mail.";}public override bool IsValid(object value) {return !string.IsNullOrEmpty((string)value) &&emailRegex.IsMatch((string)value);}public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {return new List {new ModelClientValidationRule {ValidationType = "email",ErrorMessage = this.ErrorMessage},new ModelClientValidationRule {ValidationType = "required",ErrorMessage = this.ErrorMessage}};}}Możemy zwrócić tyle obiektów ModelClientValidationRule potrzebnych do zdefiniowania zbioru zasadpo stronie klienta, ile potrzeba do wymuszenia naszych zasad poprawności.W przedstawionym przykładzieużyliśmy zasad email oraz required (ustawiając właściwość ValidationType w obiekcie ModelClientValidationRule),które korzystają z komunikatu o błędzie zdefiniowanego w atrybucie (za pomocą właściwości ErrorMessage).Nasz nowy atrybut możemy przypisać do klasy modelu identycznie jak każdy inny atrybut kontroli poprawności:public class Appointment {[EmailAddress]public string ClientName { get; set; }.Gdy tworzony jest edytor dla właściwości ClientName, silnik widoku analizuje użyte przez nas metadane,wyszukuje naszą implementację IClientValidatable i generuje atrybuty HTML przedstawione w poprzednimpunkcie.Przesłane dane są ponownie sprawdzane za pomocą naszej metody IsValid.Nasz nowy atrybut jestużywany do kontroli poprawności zarówno na serwerze, jak i na kliencie, co jest przyjemniejsze, bezpieczniejszei bardziej spójne niż jawne generowanie atrybutów HTML.Tworzenie w asnych zasad poprawno ci na klienciePrzedstawione w tabeli 18.5 wbudowane zasady kontroli poprawności na kliencie są użyteczne, ale nie wyczerpująwszystkich możliwości.Na szczęście możesz przygotować własne zasady, jeżeli jesteś w stanie napisać kilkawierszy kodu JavaScript.Obsługa kontroli poprawności na kliencie jest ograniczona w bibliotece MVC do zasad dostępnych w bazowejbibliotece jQuery.Sprowadza się to do tego, że możemy dostosowywać istniejące zasady na wiele sposobów,ale jeżeli chcemy utworzyć coś bardziej skomplikowanego, musimy zostawić wbudowaną obsługę kontrolipoprawności z MVC i operować bezpośrednio na jQuery.Mimo że mamy narzucone ograniczenie, możemytworzyć nowe, użyteczne mechanizmy.Na przykład funkcje kontroli poprawności bazujące na kliencie nie obsługują pól wyboru w sposób prawidłowy,podobnie jak przedstawione wcześniej atrybuty kontroli poprawności na serwerze.Możemy utworzyć nową,kliencką zasadę poprawności, która będzie korzystała z zasady jQuery rule dla pól wyboru, jak pokazanona listingu 18.30.509Pole ksi kKup ksi kCZ II ASP.NET MVC 3 SZCZEG� OWY OPISListing 18.30.Tworzenie własnego odwzorowania pomiędzy funkcjami kontroli poprawności w MVC i jQuery@ViewBag.TitlejQuery.validator.unobtrusive.adapters.add("checkboxtrue", function (options) {if (options.element.tagName.toUpperCase() == "INPUT" &&options.element.type.toUpperCase() == "CHECKBOX") {options.rules["required"] = true;if (options.message) {options.messages["required"] = options.message;}}});@RenderBody()Utworzyliśmy tu nową zasadę o nazwie checkboxtrue, która za pomocą zasady required z jQueryValidation ma za zadanie sprawdzić, czy pole wyboru jest zaznaczone.Skrypt ten dodaliśmy do pliku układuw projekcie (_Layout.cshtml), dzięki czemu jest on dostępny we wszystkich widokach.Uwaga Dodawanie nowych zasad kontroli poprawno ci jest zaawansowanym procesem, który wymaga dobrejznajomo ci biblioteki jQuery Validation oraz obs ugi kontroli poprawno ci po stronie klienta z biblioteki MVC.Nie b dziemy wyja nia , jak dzia a skrypt z listingu 18.29, ale je eli chcesz nauczy si dodawa nowe zasadypoprawno ci, to na pocz tek warto zapozna si z kodem ród owym z pliku jQuery.validate.unobtrusive.js.Po utworzeniu klienckiej zasady poprawności możemy utworzyć korzystający z niej atrybut.We wcześniejszejczęści rozdziału pokazaliśmy, jak utworzyć serwerowy atrybut kontroli poprawności, który pozwala upewnićsię, że pole wyboru jest zaznaczone.Na listingu 18.29 rozszerzyliśmy tę klasę atrybutu o obsługę strony klienckiej,wykorzystując zasadę checkboxtrue z listingu 18.31.Listing 18.31.Dodanie kontroli poprawności po stronie klienckiej w klasie MustBeTrueAttributepublic class MustBeTrueAttribute : ValidationAttribute, IClientValidatable {public override bool IsValid(object value) {return value is bool && (bool)value;510Pole ksi kKup ksi kROZDZIA 18.KONTROLA POPRAWNO CI MODELU}public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {return new ModelClientValidationRule[] {new ModelClientValidationRule {ValidationType = "checkboxtrue",ErrorMessage = this.ErrorMessage}};}}Teraz możemy korzystać z atrybutu MustBeTrue dla właściwości typu bool w klasach modelu, dzięki czemuupewnimy się, że użytkownik zaznaczy pole wyboru przed przesłaniem danych na serwer [ Pobierz całość w formacie PDF ]