2014-09-10 3 views
1

Comment déclencher un validateur personnalisé côté client? C'est ce que j'ai jusqu'à présent:Validation côté client ASP.NET MVC de l'attribut personnalisé

Ma classe de validation:

public class AlmostEqual : ValidationAttribute, IClientValidatable 
{ 
    private readonly string _otherProperty; 
    private readonly float _myPercent; 
    public AlmostEqual(string otherProperty,float percent) 
    { 
     _otherProperty = otherProperty; 
     _myPercent = percent; 
    } 


    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var property = validationContext.ObjectType.GetProperty(_otherProperty); 

     var otherPropertyValue = property.GetValue(validationContext.ObjectInstance, null); 

     dbEntities db = new dbEntities(); 
     Metal metal = db.Metals.Find(Convert.ToInt32(otherPropertyValue)); 

     double _unitWeight = metal.UnitWeight; 
     double _percent = metal.UnitWeight * (_myPercent/100); 

     double myProperty = double.Parse(value.ToString()); 

     bool result = myProperty >= _unitWeight - _percent && myProperty <= _unitWeight + _percent; 

     if (!result) 
     { 
      return new ValidationResult(string.Format(
        CultureInfo.CurrentCulture, 
        FormatErrorMessage(validationContext.DisplayName), 
        new[] { _otherProperty } 
       )); 
     } 


     return null; 
    } 


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), 
      ValidationType = "almostequal", 
     }; 
     rule.ValidationParameters.Add("other", _otherProperty); 
     yield return rule; 
    } 


} 

code de la classe METDATA:

 [Required]   
     [AlmostEqual("IDMetal",5,ErrorMessage="Weight do not correspond with dimensions.")] 
     public Nullable<double> UnitWeight { get; set; } 
    } 

Vu que je a ajouté js:

<script type="text/javascript"> 
     $.validator.unobtrusive.adapters.addBool("almostequal", "Range"); 
</script> 

Mon webconfig contient:

<add key="ClientValidationEnabled" value="true" /> 
<add key="UnobtrusiveJavaScriptEnabled" value="true" /> 

Je reçois l'erreur:

Uncaught TypeError: Impossible de lire la propriété 'appeler' undefined dans le fichier jquery.validate.min.js à la ligne 27

+0

S'il vous plaît jeter un oeil à: http://stackoverflow.com/questions/4747184/perform-client-side-validation-for-custom-attribute/4747466 –

+1

Le lien est de ce poste. – POIR

+0

Désolé à ce sujet, mis à jour l'URL correcte –

Répondre

1

Jetez un oeil à ceci: La seule différence que je peux repérer dans votre code est la manière dont vous avez créé la fonction $.validator.unobtrusive.adapters.addBool. Les paramètres sont un peu différents mais, peut-être, le problème est que vous n'avez pas défini la partie de la règle de votre adaptateur.

Essayez d'utiliser quelque chose comme ceci:

$.validator.unobtrusive.adapters.add("almostequal", function (options) { 
    options.rules["almostequal"] = "#" + options.element.name.replace('.', '_'); // mvc html helpers 
    options.messages["almostequal"] = options.message; 
}); 

A propos de la règle:

Le tableau règles jQuery pour cet élément HTML. L'adaptateur doit ajouter des éléments à ce tableau de règles pour les validateurs jQuery Validate spécifiques qu'il souhaite attacher. Le nom est le nom de la règle jQuery Validate et la valeur correspond aux valeurs de paramètre de la règle jQuery Validate.

Questions connexes