2010-08-23 9 views
19

Tengo un formulario de registro y el usuario debe ingresar los pies cuadrados de su casa. Me gustaría que este valor sea solo un número entero. ¿Hay alguna manera de validar este valor usando atributos asp.net mvc?Cómo hacer la validación del modelo entero en asp.net mvc 2

+1

mucho más fácil utilizar una expresión regular aquí: http://stackoverflow.com/questions/5661569/regular-expression-to-match-numbers-only-not-starting-with-zero – GP24

Respuesta

25

sí, lo es, pero tendrá que hacer una versión plana del objeto que desea crear, porque la validación con atributos solo se ejecuta DESPUÉS de que MVC haya convertido sus datos en el modelo. que, cuando su valor es un int, no podrá validar si el usuario no ingresó un int, y obtendrá un mensaje de error MVC en lugar de su mensaje de error.

¿Puedes publicar el objeto que quieres hacer?

con una versión plana me refiero a todas las fechas y fechas son picaduras en la versión plana.

entonces yo uso esto:

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

en el mismo archivo

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 mi ModelState es válida, entonces, yo uso AutoMapper convertir mi FLATModel en mi modelo, que está a sólo 2 líneas de código.

edición: si 0 es un número válido:

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

buen trabajo. . ¿Qué pasa si 0 es un número válido? – Luke101

+0

lo siento. por el problema, debería haberlo sabido. Sólo tuve un error en el cerebro – Luke101

+0

sin problemas. Espero que lo hagas funcionar por ti mismo;) – Stefanvds

59

darse cuenta de esto ya ha sido contestada, pero la respuesta Stefanvds' es uneccessarily complicado. Sólo tiene que utilizar los AT construido en la validación de atributos:

[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

Para el rango, el sistema tiene un mensaje de error "El campo XXX debe estar entre XXX y XXX". Entonces, ErrorMessage es opcional –

+5

Sí, estás en lo correcto. Pero el ErrorMessage personalizado es mucho más fácil de usar que: "El campo Square Feet debe estar entre 0 y 2147483647". ;) –

+0

Al menos en MVC2 esto no funciona si los datos pasados ​​no son un entero válido.El marco pasará en el valor predeterminado que es 0 y la validación tendrá éxito, pero luego fallará cuando el marco vaya a instanciar realmente el modelo y vea que no puede convertir los datos en un número entero. Coloca el mensaje de error predeterminado en ese punto. –

5

por lo general utiliza el atributo rango de la siguiente manera:

positiva int:

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

negativo int:

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

Cualquier int :

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

Bueno, usar Range para un campo int no funcionará si tiene algunas letras como "a".
No se llama al error Handler (ASP.NET CORE 1.0 RC2).

Cuestiones relacionadas