Як вказати мінімальний, але не максимум десятковий, використовуючи атрибут анотації даних про діапазон?


150

Я хотів би вказати, що десятичне поле для ціни повинно бути> = 0, але я не хочу нав'язувати максимальне значення.

Ось що я маю досі ... Я не впевнений, що це правильний спосіб зробити це.

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

Напевно, якщо це відбувається в базі даних, вам потрібно буде вказати максимально дозволене число на основі вибраного типу бази даних? В іншому випадку ви отримаєте неприємний виняток, якщо це число буде перевищено
Купи

Відповіді:


226

Як щодо щось подібне:

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

Це має робити те, що ви шукаєте, і ви можете уникати використання рядків.


1
Я використовував його для Int32 (Int32.MaxValue), і це нормально, дякую!
Бронек

15
Але в ньому є дурне повідомлення про перевірку :(The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
Пьотр Кула,

16
@ppumkin Använd ErrorMessage, тобто [діапазон (0,0, Double.MaxValue, ErrorMessage = "ваша помилка тут")]
flafffl

Дякую Якову. Чудова відповідь!
pimbrouwers

1
@ppumkin успадковує клас DataAnnotationsModelValidator для налаштування повідомлень про помилки
Олександр

91

Якщо ви стурбовані тим, що струна виглядає добре, ви можете це зробити:

    [Range(0, Double.PositiveInfinity)]

Це буде повідомлення про помилку за замовчуванням:

Поле SuchAndSuch повинно бути від 0 до нескінченності.


11
Це найкраща відповідь тут, IMHO, ніяких розширень, жодних, здавалося б, випадкових рядків / номерів, не користувацького коду та досить розумного повідомлення про помилку.
Вітані

42

Здається, немає іншого вибору, як ввести максимальне значення вручну. Я сподівався, що буде якийсь тип перевантаження, де вам не потрібно було вказувати.

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

14
Цей код просто виглядає жахливо. Я б запропонував використовувати dataannotationsextensions.org через nuget і як відповів @Nicolai Schlenzig. Використання [Min(0)]- це також має кращі повідомлення про перевірку. Я б запропонував оновити вашу відповідь
Пьотр Кула,

Я оновив його, щоб зробити його таким самим, як найкраща відповідь тут, оскільки ОП не передумав,
хай

Відповіді вище (@Jordan та @Jacob) набагато доречніші. Тим більше, що ми говоримо про Прайс. Я розумію, що багато разів потрібно робити транзакції з десятковими значеннями, але немає жодної ціни 1,234 дол.
Анастасіос Сельманіс

@AnastasiosSelmanis, я згоден з вами, очікуйте, що ви скажете "але немає ціни 1,234 долара". Ви припускаєте USD, і навіть тоді, коли ви використовуєте це для іноземної валюти (хоча тут не згадується ОП), USD дійсно переходить до десяткових знаків. =)
RoLYroLLs

35

Ви можете використовувати:

[Min(0)]

Це накладе необхідне мінімальне значення 0 (нуль), а не максимальне значення.

Для цього вам потрібні DataAnnotationsExtensions .


8
Ні, я не думаю, що це правильно. Це не є частиною стандартної бази MVC3, це з розширень анотацій даних dataannotationsextensions.org . Будь ласка, надайте посилання MSDN.
Берні Вайт

1
НІ - напевно НЕ є частиною MVC 3 :( Але зате ця бібліотека - це гарне розширення, щоб мати будь-який спосіб :)
Piotr Kula

1
Не є частиною MVC3, але це не важливо. Якщо ви хочете перевірити на стороні клієнта, вам просто потрібно використовувати пакет DataAnnotationsExtensions.MVC3. Ці два пакети доступні на nuget. Я думаю, що це найкращий підхід, оскільки у вас немає дурного повідомлення про помилку або не потрібно переосмислювати повідомлення про помилку щоразу, коли ви хочете перевірити додатне ціле чи десятковий (що досить часто).
gentiane

21

Якщо ви працюєте з цінами, я впевнений, що можете сміливо припускати, що нічого не обійдеться більше 1 трлн доларів.

Я б використовував:

[Range(0.0, 1000000000000)]

Або якщо вам це справді потрібно, просто вставте значення Decimal.MaxValue(без коми):79,228,162,514,264,337,593,543,950,335

Будь-яка з них спрацює добре, якщо ви не зі Зімбабве.


7
Чому б не просто [Range(0.0,Decimal.MaxValue)]?
Купи

4
Не збирається, Decimal.MaxValue не є постійною.
Джон Фаррелл

Ця константа викликає неприємності, посилаючись на файл ресурсу для тексту помилок, не простіше
Купс

3
Тепер ви робите припущення, що валюта - долар, а не єна чи щось інше.
Фред

1
@jfar Decimal.MaxValue - це константа. Просто діапазон не має перевантаження для розміщення десяткової.
Ε Г І І І О

11

Ви можете використовувати спеціальну перевірку:

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

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

Тип методів перевірки:

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

Я збирався спробувати щось подібне:

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

Проблема з цим робити полягає в тому, що компілятор хоче постійний вираз, який відключає ((double)0).ToString(). Компілятор буде приймати

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

Хто б не спричинив це, поясніть, чому ви вважаєте, що моє рішення є поганим чи не корисним? Тому що просто забороняти без будь-яких пояснень абсолютно не корисно.
Девід Т. Макнет

У вашому повідомленні про помилку має бути вказано "більше або рівне".
Ε Г І І І О

Хороший улов. Додано.
Девід Т. Макнет

1

за допомогою діапазону з

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

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

Сподіваюся, це допоможе



0

Я б сказав, decimal.MaxValue.ToString()оскільки це ефективна стеля для типу декламації, це рівнозначно тому, що не має верхньої межі.


4
Проблема в тому, що це не константа. Ви отримаєте цю помилку: Аргумент атрибута має бути виразом постійного виразу, typeof виразом або створенням масиву типу параметра атрибута
user169867

Як я зазначив нижче, але, очевидно, це хтось не оцінив.
Девід Т. Макнет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.