Apa cara terbaik untuk menambahkan validator yang lebih besar dari 0 pada sisi klien menggunakan MVC dan anotasi data?

95

Saya ingin hanya mengizinkan formulir untuk dikirim jika nilai dalam bidang tertentu lebih besar dari 0. Saya pikir mungkin atribut Mvc Range akan memungkinkan saya memasukkan hanya 1 nilai untuk menandakan hanya lebih besar dari tes, tapi tidak beruntung di sana karena bersikeras pada nilai Minimum DAN Maksimum.

Adakah ide bagaimana ini bisa dicapai?

jaffa
sumber

Jawaban:

246

Anda tidak dapat menyimpan angka yang lebih besar dari yang dapat dimiliki oleh tipe data dasar Anda sehingga fakta bahwa atribut Range memerlukan nilai maksimal adalah hal yang sangat baik. Ingat itu tidak ada di dunia nyata, jadi yang berikut ini seharusnya berfungsi:

[Range(1, int.MaxValue, ErrorMessage = "Please enter a value bigger than {1}")]
public int Value { get; set; }
Darin Dimitrov
sumber
Kelemahan dari pendekatan ini adalah bahwa jika memvalidasi "abcd" itu akan menampilkan: Please enter a value less than or equal to 2147483647.
Mike Cole
Anda seharusnya tidak dapat memasukkan huruf dalam bidang numerik. Masalah saya dengan ini adalah jika saya memasukkan 9999999999999999999 dikatakan nomor saya terlalu kecil.
John Lord
16

Saya menemukan jawaban ini untuk memvalidasi nilai positif apa pun untuk float / double. Ternyata tipe ini memiliki konstanta yang berguna untuk 'Epsilon'

Merupakan Sistem positif terkecil. Nilai ganda yang lebih besar dari nol.

    [Required]
    [Range(double.Epsilon, double.MaxValue)]
    public double Length { get; set; }
Phil
sumber
Epsilon sebenarnya adalah fungsi kalkulus. Ini adalah fungsi "batas" yang pada dasarnya mengatakan "angka terkecil yang dapat dibedakan dari nol" sehingga Anda bisa mendapatkan entri .00000001. Saya akan memberikan angka realistis pada menit.
John Lord
9

Anda dapat membuat validator Anda sendiri seperti ini:

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

Kemudian sertakan file itu dalam model Anda dan gunakan sebagai atribut seperti ini:

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

Saya biasanya menggunakan ini pada validasi dropdown. Perhatikan bahwa karena ini memperluas atribut validasi, Anda dapat menyesuaikan pesan kesalahan dengan parameter.

John Lord
sumber
1
Saya akhirnya menggunakan jawaban ini untuk situasi lain yang memang membutuhkan validator khusus. Untuk bilangan bulat sederhana yang lebih besar dari nol validasi, jawaban Darin's harus digunakan.
Zach
Saya sebenarnya lebih suka metodenya juga, tetapi orang yang bekerja dengan saya memiliki masalah dengan "batasan sewenang-wenang" pada nilai.
John Lord
Ha, sepertinya aneh. Saya bisa melihat alasan mereka jika rentang yang valid kurang dari ukuran bilangan bulat maks.
Zach
ini lebih merupakan masalah dengan desimal. Tanpa melihat, saya cukup yakin bahwa tidak ada fungsi min atau maks.
John Lord
Ini adalah solusi terbaik untuk saya!
Dave Stuart