Làm cách nào để chỉ định một số thập phân tối thiểu nhưng không có số thập phân tối đa bằng cách sử dụng thuộc tính chú thích dữ liệu phạm vi?


150

Tôi muốn chỉ định rằng trường thập phân cho giá phải> = 0 nhưng tôi không thực sự muốn áp đặt giá trị tối đa.

Đây là những gì tôi có cho đến nay ... Tôi không chắc cách chính xác để làm điều này là gì.

[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; }

Chắc chắn nếu điều này đi vào cơ sở dữ liệu, bạn sẽ cần chỉ định số lượng tối đa được phép dựa trên loại cơ sở dữ liệu đã chọn? Nếu không, bạn sẽ nhận được một ngoại lệ khó chịu nếu vượt quá số lượng này
Coops

Câu trả lời:


226

Còn những thứ như thế này thì sao:

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

Điều đó sẽ làm những gì bạn đang tìm kiếm và bạn có thể tránh sử dụng chuỗi.


1
Tôi đã sử dụng nó cho Int32 (Int32.MaxValue) và nó ổn, cảm ơn!
Bronek

15
Nó không hiển thị một thông báo xác thực ngu ngốc mặc dù :(The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
Piotr Kula

16
@ppumkin Använd ErrorMessage, tức là [Phạm vi (0,0, Double.MaxValue, ErrorMessage = "lỗi của bạn ở đây")]
flafffl

Cảm ơn Jacob. Câu trả lời chính xác!
pimbrouwers

1
@ppumkin kế thừa từ lớp DataAnnotationsModelValidator để tùy chỉnh các thông báo lỗi
Alexander

91

Nếu bạn lo lắng về chuỗi trông đẹp, bạn có thể làm điều này:

    [Range(0, Double.PositiveInfinity)]

Điều này sẽ có một thông báo lỗi mặc định là:

Trường suchAndSuch phải nằm trong khoảng từ 0 đến Infinity.


11
Đây là câu trả lời tốt nhất ở đây IMHO, không có phần mở rộng, không có chuỗi / số dường như ngẫu nhiên, không có mã tùy chỉnh và thông báo lỗi hợp lý.
Vitani 14/03/2016

42

Dường như không có lựa chọn nào khác ngoài việc đưa vào giá trị tối đa bằng tay. Tôi đã hy vọng có một số loại quá tải mà bạn không cần chỉ định.

[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }

14
Mã này chỉ nhìn khủng khiếp. Tôi sẽ đề nghị sử dụng dataannotationsextensions.org qua nuget và như @Nicolai Schlenzig đã trả lời. Sử dụng [Min(0)]- Điều này cũng có một thông báo xác nhận tốt hơn. Tôi sẽ đề nghị cập nhật câu trả lời của bạn
Piotr Kula

Tôi đã cập nhật nó để làm cho nó giống như câu trả lời hay nhất ở đây, vì OP không thay đổi suy nghĩ của anh ấy lol
Worthy7

Các câu trả lời ở trên (@Jordan và @Jacob) phù hợp hơn nhiều. Đặc biệt là vì chúng ta đang nói về Giá. Tôi hiểu rằng nhiều lần giao dịch phải được thực hiện với giá trị thập phân nhưng không có giá 1,234 đô la hoặc ít nhất là hầu hết các lần bạn không muốn hiển thị điều này cho người dùng.
Anastasios Selmanis

@AnastasiosSelmanis, tôi đồng ý với bạn, mong đợi phần khi bạn nói "nhưng không có giá 1,234 đô la". Bạn đang giả định USD, và thậm chí sau đó, khi bạn sử dụng đồng này để đổi ngoại tệ (mặc dù không được đề cập ở đây bởi OP), USD sẽ đi vào số thập phân nhiều hơn. =)
RoLYroLL

35

Bạn có thể dùng:

[Min(0)]

Điều này sẽ áp đặt giá trị tối thiểu bắt buộc là 0 (không) và không có giá trị tối đa.

Bạn cần DataAnnotationsExtensions để sử dụng cái này.


8
Không, tôi không nghĩ rằng điều này là chính xác. Nó không phải là một phần của khung MVC3 tiêu chuẩn, nó là từ Phần mở rộng chú thích dữ liệu dataannotationsextensions.org . Vui lòng cung cấp một liên kết MSDN.
Bernie White

1
KHÔNG - chắc chắn KHÔNG phải là một phần của MVC 3 :( BUt rằng thư viện đó là một phần mở rộng tốt để có bất kỳ cách nào :)
Piotr Kula

1
Không phải là một phần của MVC3 nhưng nó không quan trọng. Nếu bạn muốn xác thực ở phía máy khách, bạn chỉ cần sử dụng gói DataAnnotationsExtensions.MVC3. Hai gói này có sẵn trên nuget. Tôi nghĩ rằng đó là cách tiếp cận tốt nhất, vì bạn không có thông báo lỗi ngu ngốc hoặc không cần xác định lại thông báo lỗi mỗi khi bạn muốn xác thực số nguyên hoặc số thập phân dương (khá phổ biến).
gentiane

21

Nếu bạn đang làm việc với giá cả, tôi chắc chắn rằng bạn có thể cho rằng một cách an toàn sẽ không có gì có giá hơn 1 nghìn tỷ đô la.

Tôi sẽ sử dụng:

[Range(0.0, 1000000000000)]

Hoặc nếu bạn thực sự cần nó, chỉ cần dán vào giá trị của Decimal.MaxValue(không có dấu phẩy):79,228,162,514,264,337,593,543,950,335

Một trong hai thứ này sẽ hoạt động tốt nếu bạn không đến từ Zimbabwe.


7
Tại sao không chỉ [Range(0.0,Decimal.MaxValue)]?
Coops

4
Không biên dịch, Decimal.MaxValue không phải là hằng số.
John Farrell

Hằng số đó là một mối phiền toái, việc tham khảo tệp tài nguyên cho văn bản lỗi không dễ dàng hơn
Coops

3
Bây giờ bạn đang đưa ra giả định rằng tiền tệ là đô la, không phải Yên hay thứ gì khác.
Fred

1
@jfar Decimal.MaxValue LÀ hằng số. Chỉ là Phạm vi không có quá tải để chứa số thập phân.
Ε é И

11

Bạn có thể sử dụng xác nhận tùy chỉnh:

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

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

Kiểu phương thức xác nhận:

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

2

Tôi sẽ thử một cái gì đó như thế này:

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

Tuy nhiên, vấn đề với việc làm này là trình biên dịch muốn một biểu thức không đổi, không tuân theo ((double)0).ToString(). Trình biên dịch sẽ mất

[Range(0d, (double)decimal.MaxValue, ErrorMessage = "Amount must be greater than zero.")]

Bất cứ ai hạ thấp điều này xin vui lòng giải thích lý do tại sao bạn nghĩ rằng giải pháp của tôi là kém hoặc không hữu ích? Bởi vì chỉ cần hạ cấp mà không có bất kỳ lời giải thích nào là hoàn toàn không có ích.
David T. Macknet

Thông báo lỗi của bạn sẽ nói "lớn hơn hoặc bằng".
Ε é И

Nắm bắt tốt. Thêm.
David T. Macknet

1

sử dụng Range với

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

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

Hy vọng nó sẽ giúp



0

Tôi sẽ đặt decimal.MaxValue.ToString()vì đây là trần hiệu quả cho loại decmial, nó tương đương với việc không có giới hạn trên.


4
Vấn đề là đó không phải là một hằng số. Bạn sẽ gặp lỗi này: Đối số thuộc tính phải là biểu thức không đổi, biểu thức kiểu hoặc biểu thức tạo mảng của loại tham số thuộc tính
user169867

Như tôi đã chỉ ra bên dưới, nhưng dường như nó không được ai đó đánh giá cao.
David T. Macknet
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.