Validator nilai min / maks di asp.net mvc

106

Validasi menggunakan atribut di asp.net mvc sangat bagus. Saya telah menggunakan [Range(min, max)]validator sejauh ini untuk memeriksa nilai, seperti misalnya:

[Range(1, 10)]
public int SomeNumber { get; set; }

Namun - sekarang saya perlu memeriksa kondisi min dan max secara terpisah. Saya berharap menemukan atribut seperti ini:

[MinValue(1, "Value must be at least 1")]
[MaxValue(10, "Value can't be more than 10")]
public int SomeNumber { get; set; }

Apakah ada atribut standar untuk menulis ini? Atau bagaimana saya mencapai ini?

stiank81.dll
sumber
FluentValidation dapat menjadi solusi lain untuk menyelesaikan rentang tanggal. Inilah jawaban saya untuk pertanyaan lain yang mungkin bisa membantu .
Zinov

Jawaban:

48

Berikut adalah cara saya menulis validator untuk MaxValue

public class MaxValueAttribute : ValidationAttribute
    {
        private readonly int _maxValue;

        public MaxValueAttribute(int maxValue)
        {
            _maxValue = maxValue;
        }

        public override bool IsValid(object value)
        {
            return (int) value <= _maxValue;
        }
    }

Atribut MinValue harus sama persis

Charles Ouellet
sumber
Ok, saya berharap mereka ada, tapi cukup adil untuk menuliskannya. Terima kasih!
stiank81
1
Untuk diketahui, ini tidak akan secara ajaib memvalidasi formulir di akhir Javascript. Anda perlu menulis kode tambahan + js untuk itu.
basarat
3
@basarat sebenarnya Anda tidak memerlukan JS tambahan, pustaka validasi jquery sudah memiliki fungsi untuk min / max, Anda hanya perlu mengimplementasikan IClientValidationantarmuka pada atribut di atas dan mengembalikan nilai yang benar dari GetClientValidationRulesmetode
WickyNilliams
@WickyNilliams maukah Anda menambahkan jawaban dengan contoh komentar Anda, atau CharlesOuellet akankah Anda mengedit jawaban ini dengan contoh komentar Wicky? Saya ingin memberi suara positif pada contoh kerja yang mencakup validasi sisi klien.
Johnie Karr
@JohnieKarr Saya tidak lagi bekerja dengan .NET, jadi saya tidak bisa memberikan banyak jawaban. Konon, jawaban di bawah ini tampaknya menunjukkan dengan tepat apa yang saya gambarkan
WickyNilliams
195

Saya rasa atribut validasi min / max tidak ada. Saya akan menggunakan sesuatu seperti

[Range(1, Int32.MaxValue)]

untuk nilai minimum 1 dan

[Range(Int32.MinValue, 10)]

untuk nilai maksimum 10

Orang
sumber
4
Mmm .. Kurang nyaman dengan ini. Tampak agak hacky bagi saya.
stiank81
21
Agak hacky .. tapi terkadang hack membuat saya merasa lebih nyaman :)
Guy
4
Pendekatan ini baik-baik saja selama Anda menimpa pesan kesalahan default atau Anda akan mendapatkan sesuatu yang mengerikan seperti: "Properti x harus antara -2e ^ 31-1 dan 10".
Nine Tails
2
Bagaimana ini bisa diretas dan tidak nyaman? Sepertinya pendekatan yang bagus untuk saya.
1
RangeAttributemiliki AllowMultiple = false, jadi ini tidak dapat dikompilasi.
Daniel Schilling
38

Contoh lengkap bagaimana ini bisa dilakukan. Untuk menghindari penulisan skrip validasi sisi klien, ValidationType = "range" yang ada telah digunakan.

public class MinValueAttribute : ValidationAttribute, IClientValidatable
{
    private readonly double _minValue;

    public MinValueAttribute(double minValue)
    {
        _minValue = minValue;
        ErrorMessage = "Enter a value greater than or equal to " + _minValue;  
    }

    public MinValueAttribute(int minValue)
    {
        _minValue = minValue;
        ErrorMessage = "Enter a value greater than or equal to " + _minValue;
    }

    public override bool IsValid(object value)
    {
        return Convert.ToDouble(value) >= _minValue;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = ErrorMessage;
        rule.ValidationParameters.Add("min", _minValue);
        rule.ValidationParameters.Add("max", Double.MaxValue);
        rule.ValidationType = "range";
        yield return rule;
    }

}
Mario
sumber
8
Jawaban yang bagus. Saya akan mengubah pesan kesalahan sedikit: "Masukkan nilai lebih besar dari atau sama dengan" adalah pesan kesalahan yang lebih (secara tata bahasa) benar.
Tieson T.
0

Plugin Validasi jQuery sudah mengimplementasikan aturan min dan max, kita hanya perlu membuat adaptor untuk atribut khusus kita:

public class MaxAttribute : ValidationAttribute, IClientValidatable
{
    private readonly int maxValue;

    public MaxAttribute(int maxValue)
    {
        this.maxValue = maxValue;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();

        rule.ErrorMessage = ErrorMessageString, maxValue;

        rule.ValidationType = "max";
        rule.ValidationParameters.Add("max", maxValue);
        yield return rule;
    }

    public override bool IsValid(object value)
    {
        return (int)value <= maxValue;
    }
}

Adaptor:

$.validator.unobtrusive.adapters.add(
   'max',
   ['max'],
   function (options) {
       options.rules['max'] = parseInt(options.params['max'], 10);
       options.messages['max'] = options.message;
   });

Atribut min akan sangat mirip.

Benas Radzevicius
sumber