хорошо, это атрибут проверки, который может вас туда доставить.
public class RangeIfNotEqualToAttribute : RangeAttribute
{
string otherProperty;
public RangeIfNotEqualToAttribute(string otherProperty, int rangeStart, int rangeEnd) :base(rangeStart,rangeEnd)
{
this.otherProperty = otherProperty;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var otherPropertyInfo = validationContext.GetType().GetProperty(otherProperty);
var oldValue = (int)otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);
if (oldValue == (int)value)
return ValidationResult.Success;
return base.IsValid(value, validationContext);
}
}
он наследуется от RangeAttribute и возвращает base.IsValid
, если текущее значение не равно старому (предполагается, что вы переносите старое значение в какое-то другое свойство этой же модели. изменения в вашей модели
public class SomeViewModel
{
public int BackupProperty{get;set;}
[Required]
[RangeIfNotEqualTo("BackupProperty",10, 20)]
public int? SomeProperty { get; set; }
public int? AnotherProperty { get; set; }
}
при передаче модели для просмотра необходимо также скопировать значение SomeProperty
в BackupProperty
. Кроме того, вы должны отобразить скрытое поле для BackupProperty
, чтобы оно было отправлено обратно вместе с моделью. Скрытое поле также важно, если вы хотите реализовать IClientValidatable
для включения проверки на стороне клиента. Вы можете увидеть в этот пост для реализации IClientValidatable
в аналогичном сценарии