Come specificare un decimale minimo ma nessun massimo utilizzando l'attributo annotazione dati intervallo?


150

Vorrei specificare che un campo decimale per un prezzo deve essere> = 0 ma non voglio davvero imporre un valore massimo.

Ecco cosa ho finora ... Non sono sicuro di quale sia il modo corretto di farlo.

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

Sicuramente se questo sta andando in un database dovresti specificare il numero massimo consentito in base al tipo di database selezionato? Altrimenti otterrai una brutta eccezione se questo numero viene superato
Coops

Risposte:


226

Che ne dici di qualcosa del genere:

[Range(0.0, Double.MaxValue, ErrorMessage = "The field {0} must be greater than {1}.")]

Questo dovrebbe fare quello che stai cercando e puoi evitare di usare le stringhe.


1
L'ho usato per Int32 (Int32.MaxValue) ed è ok, grazie!
Bronek,

15
Tuttavia mostra uno stupido messaggio di convalida :(The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
Piotr Kula,

16
@ppumkin Använd ErrorMessage, ovvero [Range (0.0, Double.MaxValue, ErrorMessage = "il tuo errore qui")]
flafffl

Grazie Jacob. Bella risposta!
pimbrouwers,

1
@ppumkin eredita dalla classe DataAnnotationsModelValidator per personalizzare i messaggi di errore
Alexander

91

Se sei preoccupato che la stringa abbia un bell'aspetto, puoi farlo:

    [Range(0, Double.PositiveInfinity)]

Questo avrà un messaggio di errore predefinito di:

Il campo SuchAndSuch deve essere compreso tra 0 e Infinity.


11
Questa è la risposta migliore qui IMHO, nessuna estensione, nessuna stringa / numero apparentemente casuale, nessun codice personalizzato e un messaggio di errore ragionevolmente ragionevole.
Vitani,

42

Sembra che non ci sia altra scelta che inserire manualmente il valore massimo. Speravo ci fosse un qualche tipo di sovraccarico in cui non era necessario specificarne uno.

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

14
Questo codice ha un aspetto orribile. Suggerirei di utilizzare dataannotationsextensions.org via nuget e come ha risposto @Nicolai Schlenzig. Usa [Min(0)]: anche questo ha un messaggio di convalida migliore. Suggerirei di aggiornare la tua risposta
Piotr Kula del

L'ho aggiornato per renderlo uguale alla migliore risposta qui, poiché l'OP non sta cambiando idea lol
Worthy7

Le risposte sopra (@Jordan e @Jacob) sono molto più appropriate. Soprattutto dal momento che stiamo parlando di Price. Comprendo che molte volte le transazioni devono essere eseguite con valori decimali, ma non esiste alcun prezzo di 1,234 dollari o almeno la maggior parte delle volte che non si desidera mostrarlo all'utente.
Anastasios Selmanis,

@AnastasiosSelmanis, sono d'accordo con te, aspetto la parte quando dici "ma non c'è alcun prezzo di 1.234 dollari". Stai assumendo USD, e anche allora, quando lo usi per i cambi (anche se non menzionato qui dall'OP), l'USD va in più decimali. =)
RoLYroLLs

35

Puoi usare:

[Min(0)]

Ciò imporrà un valore minimo richiesto di 0 (zero) e nessun valore massimo.

È necessario DataAnnotationsExtensions per utilizzare questo.


8
No, non penso sia corretto. Non fa parte del framework MVC3 standard, ma è tratto da Dataannotations Extensions dataannotationsextensions.org . Fornisci un collegamento MSDN.
Bernie White,

1
NO - sicuramente NON fa parte di MVC 3 :( BUt che la libreria è una buona estensione per avere un modo :)
Piotr Kula

1
Non fa parte di MVC3 ma non è importante. Se si desidera la convalida sul lato client, è sufficiente utilizzare il pacchetto DataAnnotationsExtensions.MVC3. Questi due pacchetti sono disponibili su nuget. Penso che sia l'approccio migliore, in quanto non hai uno stupido messaggio di errore o non hai bisogno di ridefinire il messaggio di errore ogni volta che vuoi convalidare numeri interi positivi o decimali (che è abbastanza comune).
gentiane,

21

Se stai lavorando con i prezzi, sono sicuro che puoi tranquillamente presumere che nulla costerà più di 1 trilione di dollari.

Vorrei usare:

[Range(0.0, 1000000000000)]

O se ne hai davvero bisogno, basta incollare il valore di Decimal.MaxValue(senza le virgole):79,228,162,514,264,337,593,543,950,335

Uno di questi funzionerà bene se non sei dello Zimbabwe.


7
Perché non solo [Range(0.0,Decimal.MaxValue)]?
Coops

4
Non compilare, Decimal.MaxValue non è una costante.
John Farrell,

Quella costante è una seccatura, fare riferimento a un file di risorse per il testo dell'errore non è più facile
Coops

3
Ora stai assumendo che la valuta sia il dollaro, non lo yen o qualcos'altro.
Fred,

1
@jfar Decimal.MaxValue È una costante. È solo che l'intervallo non ha sovraccarico per contenere un decimale.
Ε Г И І И О

11

Puoi utilizzare la convalida personalizzata:

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

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

Tipo di metodi di convalida:

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 });
        }
    }
}

2

Stavo per provare qualcosa del genere:

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

Il problema con ciò, tuttavia, è che il compilatore desidera un'espressione costante, che non consente ((double)0).ToString(). Il compilatore sarà prendere

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

Chiunque abbia effettuato il downvoting di questo può spiegare perché pensi che la mia soluzione sia scarsa o non utile? Perché il downvoting senza alcuna spiegazione è del tutto inutile.
David T. Macknet,

Il tuo messaggio di errore dovrebbe dire "maggiore o uguale a".
Ε Г И І И О

Buona pesca. Aggiunto.
David T. Macknet,

1

usando Range con

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

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

Spero che possa aiutare


1

[Range (0.01.100000000, ErrorMessage = "Il prezzo deve essere più basso di zero!")]


0

Vorrei decimal.MaxValue.ToString()dire che questo è il limite effettivo per il tipo decimale equivale a non avere un limite superiore.


4
Il problema è che non è una costante. Otterrai questo errore: un argomento di attributo deve essere un'espressione costante, un'espressione di tipo o un'espressione di creazione di array di un tipo di parametro di attributo
user169867

Come ho indicato di seguito, ma a quanto pare non è stato apprezzato da qualcuno.
David T. Macknet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.