Я хотел бы указать, что десятичное поле для цены должно быть> = 0, но я не хочу навязывать максимальное значение.
Вот что у меня есть ... Я не уверен, как правильно это сделать.
[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; }
Я хотел бы указать, что десятичное поле для цены должно быть> = 0, но я не хочу навязывать максимальное значение.
Вот что у меня есть ... Я не уверен, как правильно это сделать.
[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; }
Ответы:
Как насчет чего-то вроде этого:
[Range(0.0, Double.MaxValue, ErrorMessage = "The field {0} must be greater than {1}.")]
Это должно делать то, что вы ищете, и вы можете избежать использования строк.
The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
Если вы обеспокоены тем, что строка выглядит красиво, вы можете сделать это:
[Range(0, Double.PositiveInfinity)]
Это будет иметь сообщение об ошибке по умолчанию:
Поле SuchAndSuch должно быть от 0 до бесконечности.
Кажется, нет другого выбора, кроме как ввести максимальное значение вручную. Я надеялся, что был какой-то тип перегрузки, когда вам не нужно было указывать его.
[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }
[Min(0)]
- это также имеет лучшее сообщение проверки. Я бы предложил обновить ваш ответ
Ты можешь использовать:
[Min(0)]
Это наложит обязательное минимальное значение 0 (ноль), а не максимальное значение.
Вам нужны DataAnnotationsExtensions, чтобы использовать это.
Если вы работаете с ценами, я уверен, вы можете с уверенностью предположить, что ничего не будет стоить более 1 триллиона долларов.
Я бы использовал:
[Range(0.0, 1000000000000)]
Или, если вам это действительно нужно, просто вставьте значение Decimal.MaxValue
(без запятых):79,228,162,514,264,337,593,543,950,335
Любой из них будет хорошо работать, если вы не из Зимбабве.
[Range(0.0,Decimal.MaxValue)]
?
Вы можете использовать пользовательскую проверку:
[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 });
}
}
}
Я собирался попробовать что-то вроде этого:
[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.")]
[Range (0.01,100000000, ErrorMessage = "Цена должна быть больше нуля!")]
Я бы decimal.MaxValue.ToString()
сказал, так как это эффективный потолок для десятичного типа, он эквивалентен отсутствию верхней границы.