Trình xác thực giá trị tối thiểu / giá trị tối đa trong asp.net mvc


106

Xác thực bằng cách sử dụng các thuộc tính trong asp.net mvc thực sự tốt. Tôi đã sử dụng [Range(min, max)]trình xác thực cho đến nay để kiểm tra các giá trị, chẳng hạn như:

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

Tuy nhiên - bây giờ tôi cần kiểm tra điều kiện tối thiểu và tối đa riêng biệt. Tôi dự kiến ​​sẽ tìm thấy các thuộc tính như sau:

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

Có bất kỳ thuộc tính nào được xác định trước để viết điều này không? Hoặc làm cách nào để đạt được điều này?


FluentValidation có thể là một giải pháp khác để giải quyết phạm vi ngày. Đây là câu trả lời của tôi cho một câu hỏi khác có thể hữu ích .
Zinov

Câu trả lời:


48

Đây là cách tôi viết trình xác thực cho 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;
        }
    }

Thuộc tính MinValue phải khá giống nhau


Ok, đã mong đợi rằng chúng tồn tại, nhưng đủ công bằng để viết chúng. Cám ơn!
stiank81

1
Chỉ FYI, điều này sẽ không xác thực một cách kỳ diệu biểu mẫu ở phần cuối Javascript. Bạn sẽ cần phải viết thêm mã + js cho điều đó.
basarat,

3
@basarat thực sự bạn sẽ không cần JS thêm, thư viện xác nhận jquery đã có chức năng cho min / max, bạn chỉ cần thực hiện các IClientValidationgiao diện trên các thuộc tính trên và trả lại giá trị đúng từ GetClientValidationRulesphương pháp
WickyNilliams

@WickyNilliams bạn sẽ thêm câu trả lời với ví dụ về nhận xét của mình hay CharlesOuellet sẽ chỉnh sửa câu trả lời này bằng ví dụ về nhận xét của Wicky? Tôi rất thích ủng hộ một ví dụ làm việc bao gồm xác thực phía máy khách.
Johnie Karr

@JohnieKarr Tôi không làm việc với .NET nữa, vì vậy tôi không thể cung cấp nhiều câu trả lời. Điều đó nói rằng, câu trả lời bên dưới này dường như hiển thị chính xác những gì tôi đã mô tả
WickyNilliams

195

Tôi không nghĩ rằng thuộc tính xác thực tối thiểu / tối đa tồn tại. Tôi sẽ sử dụng một cái gì đó như

[Range(1, Int32.MaxValue)]

cho giá trị nhỏ nhất 1 và

[Range(Int32.MinValue, 10)]

cho giá trị lớn nhất 10


4
Mmm .. Không hoàn toàn thoải mái với điều này. Trông tôi hơi khó hiểu.
stiank81

21
Nó là một chút hacky .. nhưng đôi khi hack làm cho tôi cảm thấy thoải mái hơn :)
Guy

4
Cách tiếp cận này là tốt miễn là bạn ghi đè thông báo lỗi mặc định hoặc bạn sẽ nhận được một cái gì đó khủng khiếp như: "Thuộc tính x phải nằm trong khoảng -2e ^ 31-1 đến 10".
Nine Tails

2
Làm thế nào là hacky và khó chịu này? Có vẻ như một cách tiếp cận tốt đối với tôi.

1
RangeAttributeAllowMultiple = false, vì vậy điều này không thể biên dịch.
Daniel Schilling

38

Một ví dụ đầy đủ về cách điều này có thể được thực hiện. Để tránh phải viết tập lệnh xác thực phía máy khách, ValidationType = "range" hiện có đã được sử dụng.

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

}

8
Câu trả lời chính xác. Tôi sẽ sửa đổi thông báo lỗi một chút: "Nhập giá trị lớn hơn hoặc bằng" là thông báo lỗi đúng hơn (nói theo ngữ pháp).
Tieson T.

0

jQuery Validation Plugin đã triển khai các quy tắc tối thiểu và tối đa, chúng tôi chỉ cần tạo bộ điều hợp cho thuộc tính tùy chỉnh của mình:

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

Bộ chuyển đổi:

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

Thuộc tính Min sẽ rất giống nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.