У меня есть десятичное поле, например:
public decimal Limit {get; set;}
Теперь я пытаюсь использовать плавную проверку для правила вроде:
This field is not mandatory but if it IS populated, then validate its greater than 0. If it isn't populated, then ignore it
Как я могу это сделать? Моя проблема с десятичным значением по умолчанию - 0, так как я могу определить, был ли он заполнен 0 или нет?
Я пробовал что-то вроде:
When(x => x.Limit== 0, () =>
{
RuleFor(x => x.Limit)
.Empty()
.GreaterThan(0)
.WithMessage("{PropertyName} sflenlfnsle Required");
})
Спасибо
Вы можете заполнить его в конструкторе какой-нибудь константой, которую невозможно установить, например MinValue.
Я не хочу, чтобы десятичное поле допускало значение NULL. Не имеет смысла.
@magna_nz Вы ошибаетесь: в этом есть смысл. Как еще вы можете определить, был ли необязательный тип значения явно задан для значения или просто создан со значением по умолчанию для этого типа? В отличие от ссылочного типа, у него не будет значения null, если он не был установлен, вместо этого он будет иметь значение по умолчанию.





Как указано в комментарии, единственный способ отличить тип значения, который не был установлен (и, следовательно, имеет значение по умолчанию), и тип, для которого установлено значение по умолчанию, - это изменить тип на тип, допускающий значение NULL.
void Main()
{
var example1 = new SomeType(); // Limit not set, should pass validation
var example2 = new SomeType(){Limit = 0}; // Limit set, but illegal value, should fail validation
var example3 = new SomeType(){Limit = 10.9m}; // Limit set to legal value, should pass validation
var validator = new SomeTypeValidator();
Console.WriteLine(validator.Validate(example1).IsValid); // desired is 'true'
Console.WriteLine(validator.Validate(example2).IsValid); // desired is 'false'
Console.WriteLine(validator.Validate(example3).IsValid); // desired is 'true'
}
public class SomeType
{
public Decimal? Limit { get; set; }
}
public class SomeTypeValidator : AbstractValidator<SomeType>
{
public SomeTypeValidator()
{
RuleFor(r=>r.Limit.Value)
.NotEmpty()
.When(x=> x.Limit.HasValue);
}
}
Возможно, с десятичным числом, допускающим значение NULL?
public decimal? Limit {get; set;}