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?

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

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.