[ 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 ]