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:
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:
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:
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