2010-09-14 5 views
0

J'ai cette propriété sur une classe:ASP.NET MVC 2 validation de la valeur numérique

public virtual decimal? Number { get; set; } 

Quand je l'utilise sur un formulaire, MVC valide automatiquement. Si l'utilisateur entre une lettre, naturellement une erreur est renvoyée:

"La valeur 'D' n'est pas valide pour le nombre." Comment puis-je modifier un tel message d'erreur ou même contrôler ce comportement? Je ne trouve pas l'attribut associé ou quelque chose comme ça.

Merci!

Répondre

0

Ce n'est en fait pas un message qui dérive de la validation du modèle. Le message est ajouté à l'état du modèle lorsque le classeur du modèle est incapable de convertir une valeur d'entrée en le type de valeur de la propriété liée. Cela peut se produire par exemple lorsque la propriété liée est un nombre entier et que l'utilisateur a entré un caractère non numérique dans le champ de saisie de cette propriété. Pour surcharger le message, vous devrez malheureusement le faire de manière "hard", c'est-à-dire étendre la classe DefaultModelBinder et remplacer la méthode SetProperty. Voici un exemple:

public class MyModelBinder: DefaultModelBinder 
{ 
    public MyModelBinder() 
    { 
    } 

    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value) 
    { 
     string key = bindingContext.ModelName + "." + propertyDescriptor.Name; 
     if (bindingContext.ModelState[key] != null) 
     { 

      foreach (ModelError error in bindingContext.ModelState[key].Errors) 
      { 
       if (IsFormatException(error.Exception)) 
       { 
        bindingContext.ModelState[key].Errors.Remove(error); 
        bindingContext.ModelState[key].Errors.Add(string.Format("My message for {0}.", propertyDescriptor.DisplayName)); 
        break; 
       } 
      } 
     } 
     base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value); 
    } 

    private bool IsFormatException(Exception e) 
    { 
     while (e != null) 
     { 
      if (e is FormatException) 
      { 
       return true; 
      } 
      e = e.InnerException; 
     } 
     return false; 
    } 
} 
0

utilisation simple plage donnée validateur Funda et vous obtiendrez ce que vous voulez

Pour toute validation de numéro que vous devez utiliser différentes validation de gamme différente selon vos besoins:

pour Integer

[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")] 

pour flotteur

[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")] 

pour doubles

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")] 
+0

@fedorui merci pour le montage. Ce sera plus compréhensible. mais est-ce utile ou non? – Dilip0165