2010-07-27 4 views
103

Me gustaría especificar que un campo decimal para un precio debe ser> = 0, pero realmente no quiero imponer un valor máximo.¿Cómo especificar un decimal mínimo pero no máximo utilizando el atributo de anotación de datos de rango?

Esto es lo que tengo hasta ahora ... No estoy seguro de cuál es la forma correcta de hacerlo.

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

Sin duda, si esto va en una base de datos que se necesita para especificar el número máximo permitido en base al tipo de base de datos seleccionado? De lo contrario, obtendrá una desagradable excepción si se excede este número – Coops

Respuesta

32

Bueno, parece que no hay más remedio que poner el valor máximo manualmente. Esperaba que hubiera algún tipo de sobrecarga donde no necesitaras especificar uno.

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

Este código sólo un aspecto horrible. yo lo haría sugiera usar http://dataannotationsextensions.org/ via nuget y como @Nicolai Schlenzig a nswered. Use '[Min (0)]' - Esto también tiene un mejor mensaje de validación. Sugeriría actualizar su respuesta – ppumkin

+9

¡Esta respuesta no debe ser aceptada! – Celdor

+0

he actualizado para que sea la misma que la mejor respuesta aquí, ya que el PO no está cambiando su mente lol – Worthy7

1

yo pondría decimal.MaxValue.ToString() ya que este es el límite máximo efectivo para el tipo decmial es equivalente a no tener un límite superior.

+3

El problema es que no es una constante. Obtendrá este error: un argumento de atributo debe ser una expresión constante, un tipo de expresión o una expresión de creación de matriz de un tipo de parámetro de atributo – user169867

+0

Como señalé a continuación, pero aparentemente no fue apreciado por alguien. –

153

¿Qué tal algo como esto:

[Range(0.0, Double.MaxValue)] 

Eso debería hacer lo que está buscando y se puede evitar el uso de cadenas.

+10

Eso funciona para el doble, pero ¿qué pasa con el decimal? – user169867

+1

Lo he usado para Int32 (Int32.MaxValue) y está bien, ¡gracias! – Bronek

+11

sí muestra un mensaje de validación estúpida aunque :('el campo fijo descuento en el precio debe estar entre 0,01 y 1.79769313486232E + 308.' – ppumkin

18

Si está trabajando con precios estoy seguro de que puede asumir que nada costará más de 1 billón de dólares.

que haría uso:

[Range(0.0, 1000000000000)] 

O si realmente lo necesita, sólo tiene que pegar en el valor de Decimal.MaxValue (sin comas): 79.228.162.514.264.337.593.543.950.335

uno de estos funcionan bien si no eres de Zimbabwe

+6

¿Por qué no simplemente' [Range (0.0, Decimal.MaxValue)]?? – Coops

+2

No se compilará, Decimal.MaxValue no una constante. – jfar

+0

esa constante es una molestia, en referencia a un archivo de recursos para el texto de error no es más fácil – Coops

29

Se puede utilizar:

[Min(0)] 

esto supondrá un valor requerido mínimo de 0 (cero), y ningún valor máximo.

Necesita DataAnnotationsExtensions para usar esto.

+8

No, no creo que esto sea correcto. No forma parte del marco MVC3 estándar de Extensiones de anotaciones de datos http://dataannotationsextensions.org/. Proporcione un enlace de MSDN. –

+1

NO - definitivamente no es parte de MVC 3 :(pero esa biblioteca es una buena extensión para tener alguna manera :) – ppumkin

+1

No forma parte del MVC3 pero no es importante. Si desea la validación por parte del cliente, solo necesita usar el paquete DataAnnotationsExtensions.MVC3. Estos dos paquetes están disponibles en Nuget. Creo que es el mejor enfoque, ya que no tiene un mensaje de error estúpido o no es necesario redefinir el mensaje de error cada vez que desea validar número entero positivo o decimal (que es bastante común). – gentiane

9

Usted puede utilizar validación personalizada:

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

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

Validación Tipo métodos:

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

que iba a intentar algo como esto:

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

El problema de hacer esto, sin embargo, es que el compilador quiere una expresión constante, que no permite ((double)0).ToString().El compilador se tomar

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

¿Quién rechazó esto, explique por qué cree que mi solución es deficiente o no útil? Porque solo la votación negativa sin ninguna explicación es totalmente inútil. –

51

Si usted está preocupado por la cadena de aspecto agradable que podría hacer esto:

[Range(0, Double.PositiveInfinity)] 

Esto tendrá un mensaje de error por defecto de:

The field SuchAndSuch must be between 0 and Infinity.

+4

Esta es la mejor respuesta aquí en mi humilde opinión, sin extensiones, sin cadenas/números aparentemente aleatorios, sin código personalizado y un mensaje de error razonablemente razonable. – Jocie

0

utilizando la gama con

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

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

esperan que ayude a

Cuestiones relacionadas