¿Cuál es la mejor manera de agregar un validador mayor que 0 en el lado del cliente usando MVC y anotación de datos?

95

Me gustaría poder permitir que se envíe un formulario solo si el valor en un determinado campo es mayor que 0. Pensé que tal vez el atributo Mvc Range me permitiría ingresar solo 1 valor para significar solo una prueba mayor que, pero no hay suerte allí, ya que insiste en valores mínimos y máximos.

¿Alguna idea de cómo se puede lograr esto?

jaffa
fuente

Respuestas:

246

No puede almacenar un número mayor de lo que podría contener su tipo de datos subyacente, por lo que el hecho de que el atributo Rango requiera un valor máximo es algo muy bueno. Recuerde que no existe en el mundo real, por lo que lo siguiente debería funcionar:

[Range(1, int.MaxValue, ErrorMessage = "Please enter a value bigger than {1}")]
public int Value { get; set; }
Darin Dimitrov
fuente
La desventaja de este enfoque es que si se valida "ABCD" se va a mostrar: Please enter a value less than or equal to 2147483647.
Mike Cole
no debería poder ingresar letras en un campo numérico. El problema que tengo con esto es que si entro 9999999999999999999, dice que mi número es demasiado pequeño.
John Lord
16

Encontré esta respuesta buscando validar cualquier valor positivo para un flotante / doble. Resulta que estos tipos tienen una constante útil para 'Epsilon'

Representa el valor System.Double positivo más pequeño que es mayor que cero.

    [Required]
    [Range(double.Epsilon, double.MaxValue)]
    public double Length { get; set; }
Phil
fuente
Epsilon es en realidad una función de cálculo. Es una función de "límite" que básicamente dice "el número más pequeño que se puede distinguir de cero", por lo que podría terminar con entradas de .00000001. Yo pondría un número realista en el min.
John Lord
9

Puede crear su propio validador así:

    public class RequiredGreaterThanZero : ValidationAttribute
{
    /// <summary>
    /// Designed for dropdowns to ensure that a selection is valid and not the dummy "SELECT" entry
    /// </summary>
    /// <param name="value">The integer value of the selection</param>
    /// <returns>True if value is greater than zero</returns>
    public override bool IsValid(object value)
    {
        // return true if value is a non-null number > 0, otherwise return false
        int i;
        return value != null && int.TryParse(value.ToString(), out i) && i > 0;
    }
}

Luego incluye ese archivo en tu modelo y utilízalo como un atributo como este:

    [RequiredGreaterThanZero]
    [DisplayName("Driver")]
    public int DriverID { get; set; }

Normalmente uso esto en la validación desplegable. Tenga en cuenta que debido a que extiende el atributo de validación, puede personalizar el mensaje de error con un parámetro.

John Lord
fuente
1
Terminé usando esta respuesta para otra situación que requería un validador personalizado. Para la validación de entero simple mayor que cero, se debe usar la respuesta de Darin.
Zach
De hecho, también prefiero su método, pero las personas con las que trabajo tienen un problema con "establecer límites arbitrariamente" en los valores.
John Lord
Ja, eso parece extraño. Pude ver su razonamiento si el rango válido era menor que el tamaño entero máximo.
Zach
es más un problema con los decimales. Sin mirar, estoy bastante seguro de que uno no tiene una función mínima o máxima incorporada.
John Lord
¡Esta fue la mejor solución para mí!
Dave Stuart