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 :
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 [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); } }
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
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>
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" ?
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); } }
Merci pour votre aide,
Julien
Partager