web-dev-qa-db-fra.com

Validation côté client ASP.NET MVC 3 avec paramètres

Dans le prolongement de ce post effectuer une validation côté client pour l'attribut personnalisé

J'essaie de comprendre comment faire, en passant des paramètres supplémentaires au script côté client

Si je comprends bien jusqu'à présent pour implémenter la validation personnalisée avec MVC 3, ce qui suit est requis

Créer un attribut de validation personnalisé

Basé sur ValidationAttribute et implémentant IClientValidatable. J'ai également vu quelques exemples dérivés de ModelValidator, qui semble implémenter la fonctionnalité de ValidationAttribute et IClientValidatable. C'est donc mon premier point de confusion quant à ce que sont les différences ou si ModelValidator a été utilisé dans MVC 2 mais est maintenant obsolète ou quoi?

Une instance de ModelClientValidationRule doit être retournée à partir de GetClientValidationRules () pour spécifier des détails tels que le message d'erreur, ValidationType (que je comprends être le nom de la fonction Javascript qui effectuera la validation côté client) et tout paramètre personnalisé supplémentaire que l'attribut peut avoir, et qui doivent être passés à la validation Javascript.

Je suppose que le runtime (je ne sais pas quelle partie de celui-ci) utilise ensuite le ModelClientValidationRule pour générer l'attribut html dans les éléments de balise comme suit:

data-val="true"  (to indicate that the element requires validation)
data-val-[ValidationType]=[ErrorMessage]
data-val-[ValidationType].[ValidationParameters(n).Key]=[ValidationParameters(n).Value]

Implémenter la logique de validation côté client

Une fonction Javascript doit être créée et ajoutée à jQuery.validators avec jQuery.validators.addmethod () pour que JQuery soit au courant lorsqu'elle doit être exécutée. Quelque chose comme:

jQuery.validator.addMethod(
    'greaterThan', 
    function (value, element, params) {
        /.../
       return /* true or false   */ ; 
    },
    ''
); 

Ma question ici est de savoir si la signature `` fonction (valeur, élément, paramètres) '' est standard pour les méthodes qui géreront la validation et je suppose qu'elle sera appelée par une fonctionnalité jQuery au moment approprié, comme avant l'envoi d'un formulaire ou lorsqu'un L'élément perd des fuces ou des événements keyUp. Je ne comprends tout simplement pas comment vous pouvez contrôler cela, c'est-à-dire choisir quel événement est approprié pour votre validation personnalisée.

Mettre en œuvre un adaptateur discret

Cela traduit des attributs discrets en; quelque chose sur lequel je ne suis pas très clair, mais je suppose que c'est une règle jQuery, mais je ne sais pas comment cela fonctionne. Quelque chose comme

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    { },
    function (options) {
        options.rules['greaterThan'] = true;
        options.messages['greaterThan'] = options.message;
    }
); 

Ma question ici concerne la "fonction (options)". Est-ce la fonction qui sera appelée avant "fonction (valeur, élément, paramètres)" et est chargée d'extraire les balises discrètes dans une structure de données qui peut être comprise par jQuery.Validation. D'après l'exemple de code, il me semble que options est un objet qui contient les deux, les valeurs d'attribut de la balise (telles que options.message) et les propriétés pertinentes de jQuery auxquelles il doit mapper (telles que options.messages ['ClientSideValidationFunctionName'] Si tel est le cas, comment les paramètres personnalisés sont-ils récupérés et mappés?.

J'espère que je n'ai ajouté aucune confusion supplémentaire.

54
ricardo

Vous pouvez utiliser la propriété ValidationParameters pour ajouter des paramètres personnalisés à la règle:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    var rule = new ModelClientValidationRule
    {
        ErrorMessage = this.ErrorMessage,
        ValidationType = "futuredate",
    };
    rule.ValidationParameters.Add("param1", "value1");
    rule.ValidationParameters.Add("param2", "value2");
    yield return rule;
}

qui pourrait être utilisé dans l'adaptateur:

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    [ 'param1', 'param2' ],
    function (options) {
        var param1 = options.params.param1; // shall equal 'value1'
        var param2 = options.params.param2; // shall equal 'value2'
        // TODO: use those custom parameters to define the client rules
    }
);

MISE À JOUR:

Comme demandé dans la section des commentaires, voici comment vous pouvez transmettre ces paramètres à la fonction de règle de validation personnalisée:

jQuery.validator.unobtrusive.adapters.add(
    'futuredate', 
    [ 'param1', 'param2' ],
    function (options) {
        // simply pass the options.params here
        options.rules['greaterThan'] = options.params;
        options.messages['greaterThan'] = options.message;
    }
);

jQuery.validator.addMethod('greaterThan', function (value, element, params) {
    // params here will equal { param1: 'value1', param2: 'value2' }
    return ...
}, '');
66
Darin Dimitrov