2010-08-23 9 views
19

Ich habe ein Anmeldeformular und der Benutzer muss die Quadratmeterzahl ihres Hauses eingeben. Ich möchte, dass dieser Wert nur eine ganze Zahl ist. Gibt es eine Möglichkeit, diesen Wert mit Attributen asp.net mvc zu validieren?Wie Integer Modellvalidierung in asp.net mvc 2

+1

Viel einfacher hier einen regulären Ausdruck zu verwenden: http://stackoverflow.com/questions/5661569/regular-expression-to-match-numbers-only-not-starting-with-zero – GP24

Antwort

25

Ja, das ist es, aber Sie müssen eine flache Version des Objekts erstellen, das Sie erstellen möchten, da die Validierung mit Attributen erst dann ausgeführt wird, nachdem MVC Ihre Daten in das Modell konvertiert hat. Wenn Ihr Wert ein int ist, wird die Überprüfung fehlschlagen, wenn der Benutzer keinen int eingegeben hat, und Sie erhalten anstelle Ihrer Fehlermeldung eine MVC-Fehlermeldung.

Können Sie das gewünschte Objekt posten?

mit einer flachen version ich meine alle datumszeiten und ints sind stiches in der flachen version.

dann verwende ich diese:

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

in der gleichen Datei

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; 

    } 
} 

wenn mein Model gültig ist dann, ich AutoMapper benutze meinen FlatModel in mein Modell zu konvertieren, die nur 2 Linien von Code.

edit: wenn 0 eine gültige Zahl ist:

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

gute Arbeit. Was ist, wenn 0 eine gültige Nummer ist? – Luke101

+0

Entschuldigung. für den Ärger hätte ich das wissen müssen. Hatte gerade ein Gehirn Furz – Luke101

+0

kein Problem. Ich hoffe, Sie bekommen es für sich selbst zu arbeiten;) – Stefanvds

59

dies bereits beantwortet Verwirklichen hat, aber Stefanvds' Antwort ist uneccessarily kompliziert. Nur MVCs in Validierung gebaut Attribute:

[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

Für den Bereich hat das System eine ErrorMessage "Das Feld XXX muss zwischen XXX und XXX liegen." Also die ErrorMessage ist optional –

+5

Ja, Sie sind richtig. Aber die benutzerdefinierte ErrorMessage ist viel benutzerfreundlicher als: "Das Feld Square Feet muss zwischen 0 und 2147483647 sein". ;) –

+0

Zumindest in MVC2 funktioniert das nicht, wenn die übergebenen Daten keine gültige ganze Zahl sind.Das Framework übergibt den Standardwert 0 und die Validierung wird erfolgreich ausgeführt, schlägt jedoch später fehl, wenn das Framework das Modell tatsächlich instanziiert und sieht, dass es die Daten nicht in eine Ganzzahl konvertieren kann. Es zeigt die Standardfehlermeldung an diesem Punkt an. –

5

ich in der Regel den Bereich Attribut wie folgt verwenden:

Positive int:

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

Negative int:

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

Alle int :

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

Gut mit Range für ein int Feld wird nicht funktionieren, wenn Sie einige Buchstaben wie "a" haben.
Der Fehler Handler wird nicht aufgerufen (ASP.NET CORE 1.0 RC2).