2010-07-27 4 views
103

Ich möchte angeben, dass ein Dezimalfeld für einen Preis> = 0 sein muss, aber ich möchte nicht wirklich einen Maximalwert auferlegen.Wie kann mit dem Annotationsattribut für Bereichsdaten ein minimales, aber kein maximales Dezimalzeichen angegeben werden?

Hier ist, was ich bisher habe ... Ich bin mir nicht sicher, was der richtige Weg ist, dies zu tun ist.

[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; } 
+0

Sicher, wenn dies in eine Datenbank geht, müssten Sie die maximal zulässige Anzahl basierend auf dem ausgewählten Datenbanktyp angeben? Andernfalls erhalten Sie eine böse Ausnahme, wenn diese Anzahl überschritten wird – Coops

Antwort

32

Nun gut, es scheint, es gibt keine andere Wahl, als den Maximalwert manuell einzugeben. Ich hatte gehofft, dass es eine Art Überladung gab, bei der du keine angeben musstest.

[Range(typeof(decimal), "0", "79228162514264337593543950335") 
    ] public decimal Price { get; set; } 
+10

Dieser Code sieht einfach schrecklich aus vorschlagen http://dataannotationsextensions.org/ via nugget und als @Nicolai Schlenzig a nswered. Verwenden Sie '[Min (0)]' - Dies hat auch eine bessere Validierungsnachricht. Ich würde vorschlagen, Ihre Antwort zu aktualisieren – ppumkin

+9

Diese Antwort sollte nicht akzeptiert werden! – Celdor

+0

Ich aktualisierte es, um es so wie die beste Antwort hier zu machen, da das OP seinen Verstand nicht ändert lol – Worthy7

1

würde ich decimal.MaxValue.ToString() setzen, da dies die effektive Obergrenze für den decmial Typen ist es nicht eine obere Grenze, die äquivalent ist.

+3

Das Problem ist, dass es keine Konstante ist. Sie erhalten diesen Fehler: Ein Attributargument muss ein konstanter Ausdruck, ein Ausdruckstyp oder ein Arrayerstellungsausdruck eines Attributparametertyps – user169867

+0

sein. Wie ich im Folgenden dargelegt habe, wurde es anscheinend von niemandem geschätzt. –

153

Wie wäre es etwa so:

[Range(0.0, Double.MaxValue)] 

das tun sollten, was Sie suchen und Sie können mit Zeichenfolgen vermeiden.

+10

Das funktioniert doppelt, aber was ist mit Dezimal? – user169867

+1

Ich habe es für Int32 (Int32.MaxValue) verwendet und es ist ok, danke! – Bronek

+11

Es zeigt jedoch eine dumme Validierung Nachricht :('Das Feld Festpreis Rabatt muss zwischen 0.01 und 1.79769313486232E + 308 sein. ' – ppumkin

18

Wenn Sie mit Preisen arbeiten, können Sie sicher davon ausgehen, dass nichts mehr als 1 Billion Dollar kosten wird.

würde ich verwenden:

[Range(0.0, 1000000000000)] 

Oder wenn Sie es wirklich brauchen, fügen Sie einfach den Wert von Decimal.MaxValue (ohne Komma): 79.228.162.514.264.337.593.543.950.335

einer dieser funktioniert gut wenn du nicht aus Simbabwe bist.

+6

Warum nicht nur' [Bereich (0.0, Decimal.MaxValue)] '? – Coops

+2

Kompilieren nicht, Decimal.MaxValue ist nicht eine Konstante – jfar

+0

Diese Konstante ist ein Ärgernis, Verweis auf eine Ressourcendatei für Fehlertext ist nicht einfacher – Coops

29

können Sie verwenden:

[Min(0)] 

Dies wird einen geforderten Mindestwert von 0 (Null) aufzuzwingen, und kein Maximalwert.

Sie benötigen DataAnnotationsExtensions, um dies zu verwenden.

+8

Nein, ich denke nicht, dass das richtig ist. Es ist nicht Teil des Standard-MVC3-Frameworks, es stammt von Data Annotations Extensions http://dataannotationsextensions.org/. Bitte geben Sie einen MSDN-Link an. –

+1

NEIN - definitiv NICHT Teil von MVC 3 :(BUt diese Bibliothek ist eine gute Erweiterung, um irgendwie zu haben :) – ppumkin

+1

Nicht Teil von MVC3, aber es ist nicht wichtig. Wenn Sie eine Validierung auf der Client-Seite wünschen, müssen Sie nur das DataAnnotationsExtensions.MVC3-Paket verwenden. Diese beiden Pakete sind auf nugget verfügbar. Ich denke, dass dies der beste Ansatz ist, da Sie keine dumme Fehlermeldung haben oder die Fehlermeldung nicht jedes Mal neu definieren müssen, wenn Sie eine positive Ganzzahl oder Dezimalzahl validieren wollen (was ziemlich häufig vorkommt). – gentiane

9

Sie benutzerdefinierte Validierung verwenden können:

[CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")] 
    public int IntValue { get; set; } 

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")] 
    public decimal DecValue { get; set; } 

Validierungsmethoden Typ:

public class ValidationMethods 
{ 
    public static ValidationResult ValidateGreaterOrEqualToZero(decimal value, ValidationContext context) 
    { 
     bool isValid = true; 

     if (value < decimal.Zero) 
     { 
      isValid = false; 
     } 

     if (isValid) 
     { 
      return ValidationResult.Success; 
     } 
     else 
     { 
      return new ValidationResult(
       string.Format("The field {0} must be greater than or equal to 0.", context.MemberName), 
       new List<string>() { context.MemberName }); 
     } 
    } 
} 
0

Ich war so etwas wie dies werde versuchen:

[Range(typeof(decimal), ((double)0).ToString(), ((double)decimal.MaxValue).ToString(), ErrorMessage = "Amount must be greater than zero.")] 

Das Problem dabei, Der Compiler benötigt jedoch einen konstanten Ausdruck, der ((double)0).ToString() nicht zulässt.Der Compiler wird nehmen

[Range(0d, (double)decimal.MaxValue, ErrorMessage = "Amount must be greater than zero.")] 
+0

Würde jemand, der das abgelehnt hat, bitte erklären, warum Sie meinen, dass meine Lösung schlecht oder nicht hilfreich ist? Denn nur eine Erklärung ohne Erklärung ist nicht hilfreich. –

51

Wenn Sie besorgt über die Zeichenfolge suchen schön, Sie könnten dies tun:

The field SuchAndSuch must be between 0 and Infinity.

+4

Das ist die beste Antwort hier IMHO, keine Erweiterungen, keine scheinbar zufällige Strings/Nummer, kein benutzerdefinierter Code und eine einigermaßen sinnvolle Fehlermeldung. – Jocie

0

:

[Range(0, Double.PositiveInfinity)] 

Dieses eine Standard-Fehlermeldung haben Verwendung des Bereichs mit

[Range(typeof(Decimal), "0", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")] 

[Range(typeof(Decimal),"0.0", "1000000000000000000"] 

Hoffe es hilft

Verwandte Themen