Как указать минимальное, но не максимальное десятичное число с помощью атрибута аннотации данных диапазона? - PullRequest
130 голосов
/ 27 июля 2010

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

Вот что у меня есть ... Я не уверен, как правильно это сделать.

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

Ответы [ 10 ]

194 голосов
/ 27 июля 2010

Как насчет этого:

[Range(0.0, Double.MaxValue)]

Это должно делать то, что вы ищете, и вы можете избежать использования строк.

72 голосов
/ 10 декабря 2015

Если вас беспокоит, что строка выглядит красиво, вы можете сделать это:

    [Range(0, Double.PositiveInfinity)]

По умолчанию будет выдано сообщение об ошибке:

Поле SuchAndSuch должно быть между0 и бесконечность.

34 голосов
/ 28 июля 2010

Кажется, что нет другого выбора, кроме как ввести максимальное значение вручную.Я надеялся, что был какой-то тип перегрузки, когда вам не нужно было указывать его.

[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }
31 голосов
/ 20 апреля 2012

Вы можете использовать:

[Min(0)]

Это налагает обязательное минимальное значение 0 (ноль), а не максимальное значение.

Вам необходимо DataAnnotationsExtensions дляиспользуйте это.

19 голосов
/ 28 июля 2010

Если вы работаете с ценами, я уверен, что вы можете с уверенностью предположить, что ничего не будет стоить больше, чем 1 триллион долларов.вам это действительно нужно, просто введите значение Decimal.MaxValue (без запятых): 79,228,162,514,264,337,593,543,950,335

Любой из них будет работать хорошо, если вы не из Зимбабве.

10 голосов
/ 31 декабря 2013

Вы можете использовать пользовательскую проверку:

    [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 });
        }
    }
}
1 голос
/ 14 июня 2019

[Range (0.01,100000000, ErrorMessage = "Цена должна быть больше нуля!")]

1 голос
/ 25 февраля 2014

Я собирался попробовать что-то вроде этого:

[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 голос
/ 27 июля 2010

Я бы поставил decimal.MaxValue.ToString(), так как это эффективный потолок для десятичного типа, он эквивалентен отсутствию верхней границы.

0 голосов
/ 19 января 2017

используя Range с

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

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

Надеюсь, это поможет

...