Bagaimana cara menentukan min tetapi tidak ada desimal maksimal menggunakan atribut anotasi data rentang?

150

Saya ingin menentukan bahwa bidang desimal untuk harga harus> = 0 tetapi saya tidak benar-benar ingin memaksakan nilai maks.

Inilah yang saya miliki sejauh ini ... Saya tidak yakin apa cara yang benar untuk melakukan ini.

[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; }
pengguna169867
sumber
Tentunya jika ini akan menjadi database Anda harus menentukan jumlah maksimum yang diizinkan berdasarkan jenis database yang dipilih? Kalau tidak, Anda akan mendapatkan pengecualian tidak menyenangkan jika angka ini terlampaui
Coops

Jawaban:

226

Bagaimana dengan sesuatu yang seperti ini:

[Range(0.0, Double.MaxValue, ErrorMessage = "The field {0} must be greater than {1}.")]

Itu harus melakukan apa yang Anda cari dan Anda dapat menghindari menggunakan string.

Yakub
sumber
1
Saya sudah menggunakannya untuk Int32 (Int32.MaxValue) dan tidak apa-apa, terima kasih!
Bronek
15
Itu memang menunjukkan pesan validasi bodoh :(The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
Piotr Kula
16
@ppumkin Använd ErrorMessage, yaitu [Kisaran (0,0, Double.MaxValue, ErrorMessage = "kesalahan Anda di sini")]
flafffl
Terima kasih Jacob. Jawaban bagus!
pimbrouwers
1
@ppumkin mewarisi dari kelas DataAnnotationsModelValidator untuk menyesuaikan pesan kesalahan
Alexander
91

Jika Anda khawatir string terlihat bagus, Anda bisa melakukan ini:

    [Range(0, Double.PositiveInfinity)]

Ini akan memiliki pesan kesalahan default:

Bidang SuchAndSuch harus antara 0 dan Infinity.

Yordania
sumber
11
Ini adalah jawaban terbaik di sini IMHO, tidak ada ekstensi, tidak ada string / nomor acak, tidak ada kode khusus, dan pesan kesalahan yang cukup masuk akal.
Vitani
42

Sepertinya tidak ada pilihan selain memasukkan nilai maksimal secara manual. Saya berharap ada beberapa jenis kelebihan di mana Anda tidak perlu menentukan satu.

[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }
pengguna169867
sumber
14
Kode ini terlihat mengerikan. Saya akan menyarankan menggunakan dataannotationsextensions.org via nuget dan sebagai @Nicolai Schlenzig menjawab. Gunakan [Min(0)]- Ini juga memiliki pesan validasi yang lebih baik. Saya sarankan memperbarui jawaban Anda
Piotr Kula
Saya memperbaruinya untuk membuatnya sama dengan jawaban terbaik di sini, karena OP tidak berubah pikiran lol
Worthy7
Jawaban di atas (@Jordan dan @Jacob) jauh lebih tepat. Terutama karena kita berbicara tentang Harga. Saya memahami bahwa berkali-kali transaksi harus dilakukan dengan nilai desimal tetapi tidak ada harga 1.234 dolar atau setidaknya sebagian besar kali Anda tidak ingin menunjukkan ini kepada pengguna.
Anastasios Selmanis
@AnastasiosSelmanis, saya setuju dengan Anda, mengharapkan bagian ketika Anda mengatakan "tetapi tidak ada harga 1.234 dolar". Anda mengasumsikan USD, dan bahkan kemudian, ketika Anda menggunakan ini untuk valuta asing (meskipun tidak disebutkan di sini oleh OP), USD memang masuk ke lebih banyak desimal. =)
RoLYroLLs
35

Kamu bisa memakai:

[Min(0)]

Ini akan memaksakan nilai minimum yang diperlukan 0 (nol), dan tidak ada nilai maksimum.

Anda perlu DataAnnotationsExtensions untuk menggunakan ini.

Nicolai Schlenzig
sumber
8
Tidak, saya pikir ini tidak benar. Ini bukan bagian dari kerangka kerja MVC3 standar, melainkan dari Data Annotations Extensions dataannotationsextensions.org . Harap berikan tautan MSDN.
Bernie White
1
TIDAK - pasti BUKAN bagian dari MVC 3 :( Tapi perpustakaan itu adalah ekstensi yang bagus untuk memiliki cara apa pun :)
Piotr Kula
1
Bukan bagian dari MVC3 tetapi tidak penting. Jika Anda ingin validasi di sisi klien, Anda hanya perlu menggunakan paket DataAnnotationsExtensions.MVC3. Kedua paket ini tersedia di nuget. Saya pikir itu adalah pendekatan terbaik, karena Anda tidak memiliki pesan kesalahan bodoh atau tidak perlu mendefinisikan ulang pesan kesalahan setiap kali Anda ingin memvalidasi bilangan bulat positif atau desimal (yang cukup umum).
gentiane
21

Jika Anda bekerja dengan harga, saya yakin Anda dapat dengan aman berasumsi tidak ada yang lebih dari 1 triliun dolar.

Saya akan menggunakan:

[Range(0.0, 1000000000000)]

Atau jika Anda benar-benar membutuhkannya, cukup tempelkan nilai Decimal.MaxValue(tanpa koma):79,228,162,514,264,337,593,543,950,335

Salah satu dari ini akan bekerja dengan baik jika Anda bukan dari Zimbabwe.

John Farrell
sumber
7
Kenapa tidak adil [Range(0.0,Decimal.MaxValue)]?
Coops
4
Tidak akan dikompilasi, Decimal.MaxValue bukan konstanta.
John Farrell
Konstanta itu merepotkan, merujuk pada file sumber daya untuk teks kesalahan juga tidak mudah
Coops
3
Sekarang Anda membuat asumsi bahwa mata uangnya adalah dolar, bukan Yen atau yang lainnya.
Fred
1
@ jfar Decimal.MaxValue ADALAH konstanta. Hanya saja Range tidak memiliki kelebihan untuk mengakomodasi desimal.
Ε Г И І И О
11

Anda dapat menggunakan validasi khusus:

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public int IntValue { get; set; }

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public decimal DecValue { get; set; }

Jenis metode validasi:

public class ValidationMethods
{
    public static ValidationResult ValidateGreaterOrEqualToZero(decimal value, ValidationContext context)
    {
        bool isValid = true;

        if (value < decimal.Zero)
        {
            isValid = false;
        }

        if (isValid)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult(
                string.Format("The field {0} must be greater than or equal to 0.", context.MemberName),
                new List<string>() { context.MemberName });
        }
    }
}
Erikas Pliauksta
sumber
2

Saya akan mencoba sesuatu seperti ini:

[Range(typeof(decimal), ((double)0).ToString(), ((double)decimal.MaxValue).ToString(), ErrorMessage = "Amount must be greater than or equal to zero.")]

Masalah dengan melakukan ini, adalah kompiler menginginkan ekspresi konstan, yang tidak diizinkan ((double)0).ToString(). Kompilator akan mengambil

[Range(0d, (double)decimal.MaxValue, ErrorMessage = "Amount must be greater than zero.")]
David T. Macknet
sumber
Akankah siapa pun yang menurunkan nilai ini tolong jelaskan mengapa Anda berpikir solusi saya buruk atau tidak membantu? Karena hanya downvoting tanpa penjelasan sama sekali sama sekali tidak membantu.
David T. Macknet
Pesan kesalahan Anda harus mengatakan "lebih besar dari atau sama dengan".
Ε Г И І И О
Tangkapan yang bagus. Ditambahkan.
David T. Macknet
1

menggunakan Rentang dengan

[Range(typeof(Decimal), "0", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")]

[Range(typeof(Decimal),"0.0", "1000000000000000000"]

Semoga ini bisa membantu

Abi
sumber
1

[Rentang (0,01,10000000000, ErrorMessage = "Harga harus lebih baik daripada nol!")]

Sohail Akhter
sumber
0

Saya akan meletakkan decimal.MaxValue.ToString()karena ini adalah langit-langit yang efektif untuk tipe decmial itu setara dengan tidak memiliki batas atas.

Dr Herbie
sumber
4
Masalahnya adalah itu tidak konstan. Anda akan mendapatkan kesalahan ini: Argumen atribut harus berupa ekspresi konstan, ekspresi typeof atau ekspresi pembuatan array tipe parameter atribut
user169867
Seperti yang saya tunjukkan di bawah, tetapi ternyata itu tidak dihargai oleh seseorang.
David T. Macknet