IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Comment déclarer plus d'1 custom data annotation pour la validation unobstrusive côté client ?


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut Comment déclarer plus d'1 custom data annotation pour la validation unobstrusive côté client ?
    Bonjour
    J'ai besoin de déclarer plusieurs validation unobstrusive côté client avec des custom data annotation.
    J'ai défini 1 1ère custom data annotation comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
        public class ValidCurrencyRequiredAttribute : ValidationAttribute, IClientValidatable
        {
            private MethodInfo CurrencyListSource { get; set; }
            private object[] parameters { get; set; }
     
            public ValidCurrencyRequiredAttribute(Type sourceType, string SourceMethodName, bool WithNone)
            {
                CurrencyListSource = sourceType.GetMethod(SourceMethodName);
                parameters = new object[2];
                parameters[0] = Convert.ToInt32(HttpContext.Current.Session["CustomerOID"]);
                parameters[1] = WithNone;
            }
     
            public override bool IsValid(object value)
            {
                ISingleResult<sel_currenciesResult> list = CurrencyListSource.Invoke(null, parameters) as ISingleResult<sel_currenciesResult>;
     
                int currencyID = (int)value;
                bool isValid = list.FirstOrDefault(m => m.OID == currencyID) != null;
                return isValid;
            }
     
            public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
            {
                var rule = new ModelClientFileExtensionValidationCurrencyRule(ErrorMessage, metadata.PropertyName);
                yield return rule;
            }
        }
     
        public class ModelClientFileExtensionValidationCurrencyRule : ModelClientValidationRule
        {
            public ModelClientFileExtensionValidationCurrencyRule(string errorMessage, string propertyName)
            {
                ErrorMessage = errorMessage;
                ValidationType = "validcurrencyrequired";
                ValidationParameters.Add("validatedcontrol", propertyName);
            }
        }
    Que je déclare dans Index.cshtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <script type="text/javascript">
        $(function () {
            LoadingPanel.Show();
            $.ajax({
                type: "GET",
                url: '@Url.Action("IndexPartial")',
                success: function (response) {
                    $("#Container").html(response);
                    LoadingPanel.Hide();
                    InitializeValidationRulesForForm();
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert("An error occured at " + (new Date()).toString());
                    LoadingPanel.Hide();
                }
            });
        });
     
        $(function () {
            jQuery.validator.unobtrusive.adapters.add('validcurrencyrequired', ['validatedcontrol'], function (options) {
                // Set up test parameters
                var params = {
                    validatedcontrol: options.params.validatedcontrol
                };
     
                // Match parameters to the method to execute
                options.rules['validcurrencyrequired'] = params;
                if (options.message) {
                    // If there is a message, set it for the rule
                    options.messages['validcurrencyrequired'] = options.message;
                }
            });
            jQuery.validator.addMethod("validcurrencyrequired", function (value, element, params) {
                var cb = ASPxClientControl.GetControlCollection().GetByName(params.validatedcontrol);
                var insertedText = cb.GetInputElement().value;
                return cb.FindItemByText(insertedText) != null;
            });
     
        } (jQuery));
     
        function InitializeValidationRulesForForm() {
            var form = $('#myBalanceSearchform');
            if (form.executed)
                return;
            form.removeData("validator");
            $.validator.unobtrusive.parse(document);
            form.executed = true;
        }
    </script>
    Jusque là tout fonctionne bien. J'ai besoin maintenant d'ajouter un autre custom data annotation distinct comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
        public class ValidThirdPartyRequiredAttribute : ValidationAttribute, IClientValidatable
        {
            private MethodInfo ThirdPartyListSource { get; set; }
            private object[] parameters { get; set; }
     
            public ValidThirdPartyRequiredAttribute(Type sourceType, string SourceMethodName)
            {
                ThirdPartyListSource = sourceType.GetMethod(SourceMethodName);
                parameters = new object[1];
                parameters[0] = Convert.ToInt32(HttpContext.Current.Session["CustomerOID"]);
            }
     
            public override bool IsValid(object value)
            {
                IEnumerable list = ThirdPartyListSource.Invoke(null, parameters) as IEnumerable;
     
                int thirdpartyID = (int)value;
                bool isValid = list.Cast<ThirdParty>().FirstOrDefault(m => m.OID == thirdpartyID) != null;
                return isValid;
            }
     
            public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
            {
                var rule = new ModelClientFileExtensionValidationThirdPartyRule(ErrorMessage, metadata.PropertyName);
                yield return rule;
            }
        }
     
        public class ModelClientFileExtensionValidationThirdPartyRule : ModelClientValidationRule
        {
            public ModelClientFileExtensionValidationThirdPartyRule(string errorMessage, string propertyName)
            {
                ErrorMessage = errorMessage;
                ValidationType = "validthirdpartyrequired";
                ValidationParameters.Add("validatedcontrol", propertyName);
            }
        }
    Et je ne sais pas commetn déclarer ce second custom data annotation dans Index.cshtml. Est-ce que j'ai besoin d'appeller 1 2ème fois jQuery.validator.unobtrusive.adapters.add et jQuery.validator.addMethod ? Ou y a-t-il moyen d'ajouter plusieurs custom data annotation validateurs en 1 appel ? Est-ce qu'il faut que je choisisse 1 nom différent pour "validatedcontrol" ?
    Merci pour votre aide,
    Julien

  2. #2
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Il faut ajouter le code qui suit dans "$(function () {" de Index.cshtml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    jQuery.validator.unobtrusive.adapters.add('validthirdpartyrequired', ['validatedcontrol'], function (options) {
                // Set up test parameters
                var params = {
                    validatedcontrol: options.params.validatedcontrol
                };
     
                // Match parameters to the method to execute
                options.rules['validthirdpartyrequired'] = params;
                if (options.message) {
                    // If there is a message, set it for the rule
                    options.messages['validthirdpartyrequired'] = options.message;
                }
            });
            jQuery.validator.addMethod("validthirdpartyrequired", function (value, element, params) {
                var cb = ASPxClientControl.GetControlCollection().GetByName(params.validatedcontrol);
                var insertedText = cb.GetInputElement().value;
                return cb.FindItemByText(insertedText) != null;
            });

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/02/2009, 12h13
  2. Comment faire plus simple
    Par mobscene dans le forum Langage
    Réponses: 5
    Dernier message: 26/07/2005, 04h12
  3. [Property] Comment déclarer une chaine par defaut ?
    Par Clorish dans le forum Composants VCL
    Réponses: 8
    Dernier message: 07/09/2004, 22h11
  4. Comment déclarer une DataSource dans server.xml
    Par guillaume06 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 16/06/2004, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo