Cách tốt nhất để thêm trình xác thực lớn hơn 0 ở phía máy khách bằng cách sử dụng MVC và chú thích dữ liệu là gì?


94

Tôi muốn chỉ có thể cho phép gửi biểu mẫu nếu giá trị trong một trường nhất định lớn hơn 0. Tôi nghĩ có thể thuộc tính Mvc Range sẽ cho phép tôi chỉ nhập 1 giá trị để biểu thị chỉ một giá trị lớn hơn thử nghiệm, nhưng không có may mắn ở đó vì nó nhấn mạnh vào giá trị Tối thiểu và Tối đa.

Bất kỳ ý tưởng làm thế nào điều này có thể đạt được?

Câu trả lời:


245

Bạn không thể lưu trữ một số lớn hơn những gì mà kiểu dữ liệu cơ bản của bạn có thể chứa, do đó, việc thuộc tính Range yêu cầu giá trị tối đa là một điều rất tốt. Hãy nhớ rằng điều đó không tồn tại trong thế giới thực, vì vậy những điều sau sẽ hoạt động:

[Range(1, int.MaxValue, ErrorMessage = "Please enter a value bigger than {1}")]
public int Value { get; set; }

Nhược điểm của phương pháp này là nếu nó xác nhận "abcd" nó sẽ hiển thị: Please enter a value less than or equal to 2147483647.
Mike Cole

bạn sẽ không thể nhập các chữ cái vào trường số. Vấn đề tôi gặp phải với điều này là nếu tôi nhập 9999999999999999999, nó nói rằng số của tôi quá nhỏ.
John Lord

16

Tôi thấy câu trả lời này đang tìm cách xác thực bất kỳ giá trị dương nào cho float / double. Hóa ra những loại này có một hằng số hữu ích cho 'Epsilon'

Đại diện cho giá trị System.Double dương nhỏ nhất lớn hơn 0.

    [Required]
    [Range(double.Epsilon, double.MaxValue)]
    public double Length { get; set; }

Epsilon thực sự là một hàm giải tích. Đây là một hàm "giới hạn" về cơ bản nói rằng "số nhỏ nhất có thể phân biệt được với số 0" vì vậy bạn có thể kết thúc với các mục nhập là .00000001. Tôi sẽ đặt một con số thực tế trên min.
John Lord

9

Bạn có thể tạo trình xác thực của riêng mình như sau:

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

Sau đó, đưa tệp đó vào mô hình của bạn và sử dụng nó như một thuộc tính như sau:

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

Tôi thường sử dụng điều này khi xác thực thả xuống. Lưu ý rằng vì nó mở rộng thuộc tính hợp lệ nên bạn có thể tùy chỉnh thông báo lỗi bằng một tham số.


1
Tôi đã kết thúc sử dụng câu trả lời này cho một tình huống khác yêu cầu trình xác thực tùy chỉnh. Đối với xác thực số nguyên đơn giản lớn hơn 0, nên sử dụng câu trả lời của Darin.
Zach

Tôi thực sự cũng thích phương pháp của anh ấy hơn, nhưng những người tôi làm việc cùng gặp vấn đề với việc "tự ý đặt giới hạn" cho các giá trị.
John Lord

Ha, điều đó có vẻ lạ. Tôi có thể thấy lý do của họ nếu phạm vi hợp lệ nhỏ hơn kích thước số nguyên tối đa.
Zach

đó là vấn đề nhiều hơn với số thập phân. Nếu không nhìn, tôi khá chắc chắn rằng một cái không có chức năng tối thiểu hoặc tối đa được tích hợp sẵn.
John Lord

Đây là giải pháp tốt nhất cho tôi!
Dave Stuart
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.