Validation côté client pour ValidationAtsortingbute personnalisé avec AtsortingbuteTargets.Class

Est-il possible d’implémenter la validation de site client pour ValidationAtsortingbute personnalisé, qui est utilisé dans l’étendue de classe? Par exemple, mon MaxLengthGlobal, qui devrait assurer la limite maximale globale pour tous les champs d’entrée.

[AtsortingbuteUsage(AtsortingbuteTargets.Class)] public class MaxLengthGlobalAtsortingbute : ValidationAtsortingbute, IClientValidatable { public int MaximumLength { get; private set; } public MaxLengthGlobalAtsortingbute(int maximumLength) { this.MaximumLength = maximumLength; } public override bool IsValid(object value) { var properties = TypeDescriptor.GetProperties(value); foreach (PropertyDescriptor property in properties) { var ssortingngValue = property.GetValue(value) as ssortingng; if (ssortingngValue != null && (ssortingngValue.Length > this.MaximumLength)) { return false; } } return true; } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule { ErrorMessage = this.FormatErrorMessage(metadata.GetDisplayName()), ValidationType = "maxlengthglobal", }; rule.ValidationParameters.Add("maxlength", this.MaximumLength); yield return rule; } } 

Je vous remercie.

Non, ce n’est pas possible. Pardon.

J’ai trouvé cette réponse en cherchant une solution au même problème et j’ai trouvé une solution de contournement.

Au lieu de 1 ValidationAtsortingbute, ayez 2:

1.) Un ServerValidationAtsortingbute sera sur la classe et n’implémentera pas IClientValidatable.

 [AtsortingbuteUsage(AtsortingbuteTargets.Class, AllowMultiple = false, Inherited = true)] public class MyCustomServerValidationAtsortingbute : ValidationAtsortingbute { public override bool IsValid(object value) { // remember to cast to the class type, not property type // ... return true or false } } 

2.) Un ClientValidationAtsortingbute sera sur le champ / la propriété et implémentera IClientValidatable, mais le remplacement IsValid renvoie toujours la valeur true.

 [AtsortingbuteUsage(AtsortingbuteTargets.Field | AtsortingbuteTargets.Property, AllowMultiple = false, Inherited = true)] public class MyCustomClientValidationAtsortingbute : ValidationAtsortingbute, IClientValidatable { public override bool IsValid(object value) { return true; } public IEnumerable GetClientValidationRules( ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule { ErrorMessage = ErrorMessage, ValidationType = "mycustomvalidator", }; var viewContext = (ViewContext)context; var dependentProperty1 = viewContext.ViewData.TemplateInfo .GetFullHtmlFieldId("DependentProperty1"); //var prefix = viewContext.ViewData.TemplateInfo.HtmlFieldPrefix; rule.ValidationParameters.Add("dependentproperty1", dependentProperty1); yield return rule; } } 

Lorsqu’il est exécuté sur le client, l’atsortingbut de serveur est ignoré, et inversement.

Si vous avez besoin d’un atsortingbut de validation sur la classe, il est probable que la validation soit effectuée sur plusieurs champs. J’ai laissé tomber dans un code standard pour passer des parameters supplémentaires à la méthode de validation du client, mais cela ne fonctionne pas comme prévu. Dans mon code actuel, j’ai commenté les vars viewContext et dependProperty1 et je viens de passer une chaîne “DependentProperty1” au deuxième argument de la méthode rule.ValidationParameters.Add. Pour une raison quelconque, je reçois un HtmlFieldPrefix incorrect. Si quelqu’un peut aider avec cela s’il vous plaît commenter …

Quoi qu’il en soit, vous vous retrouvez avec un modèle de vue comme celui-ci:

 [MyCustomServerValidation(ErrorMessage = MyCustomValidationMessage)] public class MyCustomViewModel { private const ssortingng MyCustomValidationMessage = "user error!"; [Display(Name = "Email Address")] [MyCustomClientValidation(ErrorMessage = MyCustomValidationMessage)] public ssortingng Value { get; set; } [HiddenInput(DisplayValue = false)] public ssortingng DependentProperty1 { get; set; } } 

Un script client comme celui-ci:

 ///  ///  ///  $.validator.addMethod('mycustomvalidator', function (value, element, parameters) { var dependentProperty1 = $('#' + parameters['dependentproperty1']).val(); // return true or false }); $.validator.unobtrusive.adapters.add('mycustomvalidator', ['dependentproperty1'], function (options) { options.rules['mycustomvalidator'] = { dependentproperty1: options.params['dependentproperty1'] }; options.messages['mycustomvalidator'] = options.message; } ); 

Et une vue comme celle-ci:

 @Html.EditorFor(m => m.Value) @Html.EditorFor(m => m.DependentProperty1) @Html.ValidationMessageFor(m => m.Value) @Html.ValidationMessageFor(m => m) 

Ensuite, si la validation du client est désactivée, le @Html.ValidationMessageFor(m => m) est affiché à la place de celui de la propriété.