2010-08-23 21 views
19

J'ai un formulaire d'inscription et l'utilisateur doit entrer la superficie en pieds carrés de leur maison. Je voudrais que cette valeur soit seulement un entier. Existe-t-il un moyen de valider cette valeur en utilisant les attributs asp.net mvc?Comment faire la validation de modèle Integer dans asp.net mvc 2

+1

beaucoup plus facile à utiliser une expression régulière ici: http://stackoverflow.com/questions/5661569/regular-expression-to-match-numbers-only-not-starting-with-zero – GP24

Répondre

25

oui, oui, mais vous devrez créer une version plate de l'objet que vous souhaitez créer, car la validation avec les attributs ne fonctionne qu'après avoir converti vos données dans le modèle. ce qui, quand votre valeur est un int, échouera à valider si l'utilisateur n'a pas entré un int, et vous obtiendrez un message d'erreur MVC au lieu de votre message d'erreur.

pouvez-vous poster l'objet que vous voulez faire?

avec une version à plat, je veux dire toutes les dates et ints sont des piqûres dans la version à plat.

puis-je utiliser ceci:

[DisplayName("Square meters")] 
    [PosNumberNoZero(ErrorMessage = "need a positive number, bigger than 0")] 
    public string squaremeters { get; set; } 

dans le même fichier

public class PosNumberNoZeroAttribute : ValidationAttribute { 
    public override bool IsValid(object value) { 
     if (value == null) { 
      return true; 
     } 
     int getal; 
     if (int.TryParse(value.ToString(), out getal)) { 

      if (getal == 0) 
       return false; 

      if (getal > 0) 
       return true; 
     } 
     return false; 

    } 
} 

si mon ModelState est valable, je l'utilise AutoMapper pour convertir mon FlatModel dans mon modèle, qui est à seulement 2 lignes de code.

edit: si 0 est un nombre valide:

public class PosNumberAttribute : ValidationAttribute { 
    public override bool IsValid(object value) { 
     if (value == null) { 
      return true; 
     } 
     int getal; 
     if (int.TryParse(value.ToString(), out getal)) { 

      if (getal >= 0) 
       return true; 
     } 
     return false; 
    } 
} 
+2

bon travail. .Que si 0 est un nombre valide? – Luke101

+0

désolé. pour l'ennui j'aurais dû savoir cela. Juste eu un péter cerveau – Luke101

+0

pas de problème. J'espère que vous l'obtenez pour travailler pour vous-même;) – Stefanvds

59

Rendez-vous compte ce qui a déjà reçu une réponse, mais la réponse de Stefanvds est uneccessarily compliquée. Il suffit d'utiliser CVM construit en attributs de validation:

[DisplayName("Square Feet")] 
[Required(ErrorMessage = "Square Feet is Required")] 
[Range(0, int.MaxValue, ErrorMessage = "Square Feet must be a positive number")] 
public int SquareFeet { get; set; } 
+0

For Range, le système a un ErrorMessage "Le champ XXX doit être entre XXX et XXX." Le message d'erreur est donc facultatif. –

+5

Oui, vous avez raison. Mais le CustomMessage personnalisé est beaucoup plus convivial que: "Le champ Square Feet doit être entre 0 et 2147483647". ;) –

+0

Au moins dans MVC2 cela ne fonctionne pas si les données transmises ne sont pas des nombres entiers valides.Le framework transmettra la valeur par défaut qui est 0 et la validation réussira, mais échouera plus tard lorsque le framework va réellement instancier le modèle et qu'il ne peut pas convertir les données en entier. Il met en place le message d'erreur par défaut à ce moment-là. –

5

Je l'habitude d'utiliser l'attribut plage comme ceci:

Positif int:

[Range(0,int.MaxValue)] 
public int Id { get; set; } 

négatif int:

[Range(int.MinValue,0)] 
public int Id { get; set; } 

Tout int :

[Range(int.MinValue,int.MaxValue)] 
public int Id { get; set; } 
-1

Bien utiliser Range pour un champ int ne fonctionnera pas si vous avez des lettres comme "a".
L'erreur Handler n'est pas appelée (ASP.NET CORE 1.0 RC2).