Qual é a melhor maneira de adicionar um validador maior que 0 no lado do cliente usando MVC e anotação de dados?

92

Gostaria de poder permitir o envio de um formulário apenas se o valor em um determinado campo for maior que 0. Achei que talvez o atributo Mvc Range me permitisse inserir apenas 1 valor para significar apenas um teste maior que, mas sem sorte, pois insiste em valores mínimos e máximos.

Alguma ideia de como isso pode ser alcançado?

Jaffa
fonte

Respostas:

241

Você não pode armazenar um número maior do que o seu tipo de dados subjacente poderia conter, então o fato de que o atributo Range requer um valor máximo é uma coisa muito boa. Lembre-se de que não existe no mundo real, então o seguinte deve funcionar:

[Range(1, int.MaxValue, ErrorMessage = "Please enter a value bigger than {1}")]
public int Value { get; set; }
Darin Dimitrov
fonte
A desvantagem dessa abordagem é que, se ele valida "abcd" que vai display: Please enter a value less than or equal to 2147483647.
Mike Cole
você não deve ser capaz de inserir letras em um campo numérico. O problema que tenho com isso é se eu digitar 9999999999999999999, ele diz que meu número é muito pequeno.
John Lord
12

Eu encontrei esta resposta procurando validar qualquer valor positivo para um float / double. Acontece que esses tipos têm uma constante útil para 'Epsilon'

Representa o menor valor positivo de System.Double maior que zero.

    [Required]
    [Range(double.Epsilon, double.MaxValue)]
    public double Length { get; set; }
Phil
fonte
Epsilon é na verdade uma função de cálculo. É uma função de "limite" que basicamente diz "o menor número que pode ser diferenciado de zero", então você pode acabar com entradas de 0,0000001. Eu colocaria um número realista no min.
John Lord de
9

Você pode criar seu próprio validador assim:

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

Em seguida, inclua esse arquivo em seu modelo e use-o como um atributo como este:

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

Eu normalmente uso isso na validação suspensa. Observe que, por estar estendendo o atributo de validação, você pode personalizar a mensagem de erro com um parâmetro.

John Lord
fonte
1
Acabei usando essa resposta para outra situação que exigia um validador personalizado. Para validação de inteiro simples maior que zero, a resposta de Darin deve ser usada.
Zach de
Na verdade, eu também prefiro o método dele, mas as pessoas com quem trabalho têm um problema em "definir limites arbitrariamente" nos valores.
John Lord
Ha, isso parece estranho. Eu poderia ver o raciocínio deles se o intervalo válido fosse menor que o tamanho máximo do inteiro.
Zach
é mais um problema com decimais. Sem olhar, tenho quase certeza de que não há uma função mínima ou máxima incorporada.
John Lord
Essa foi a melhor solução para mim!
Dave Stuart