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