Я использовал пользовательский атрибут проверки - AmountShouldBeLessOrEqualAttribute
- что его процесс проверки связан со значением другого свойства, и этот атрибут работает успешно .
Но в следующем сценарии у меня естьпроблема с ним:
- Запустить приложение
- Переход на страницу формы
- Отправить форму (POST форму для первого раза )
Процесс ModelBinding
вызывает форматирование значения ErrorMessage
в атрибуте AmountShouldBeLessOrEqual
.Например:
В ViewModel
есть свойство Amount
с указанным выше атрибутом
и
Его ErrorMessage: Your amount should be less than {0}
Будет преобразовано в: Your amount should be less than 23
Примечание: 23
- это значение MaxAmount
свойства в ViewModel
Теперь я изменяю MaxAmount
на 83
- Переходим на страницу формы снова и отправляем форму
- Процесс
ModelBinding
будетначать процесс проверки AmountShouldBeLessOrEqualAttibute
.Теперь, если я смотрю значение свойства ErrorMessage , оно не равно Your amount should be less than {0}
, оно остается в виде старого отформатированного текста: Your amount should be less than 23
.Поэтому он не может быть снова отформатирован в Your amount should be less than 83
Мой вопрос:
Как мне сбросить отформатированный ErrorMessages
в его Non-Formatted
версиюкаждый раз для форматирования с новым значением?
In ViewModel
:
[AmountShouldBeLessOrEqual(nameof(MaxAmount), ErrorMessage = "Your amount should be less than {0}")]
public decimal Amount { get; set; }
public decimal MaxAmount { get; set; }
AmountShouldBeLessOrEqualAttribute
:
public class AmountShouldBeLessOrEqualAttribute : ValidationAttribute
{
private readonly string _comparisonProperty;
public AmountShouldBeLessOrEqualAttribute(string comparisonProperty)
{
_comparisonProperty = comparisonProperty;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
ErrorMessage = ErrorMessageString;
var currentValue = (decimal)value;
var comparisonValue = GetComparisonValue(_comparisonProperty, validationContext);
if (ErrorMessage == null && ErrorMessageResourceName == null)
{
ErrorMessage = "Amount is large";
}
else
{
ErrorMessage = string.Format(ErrorMessage ?? "", comparisonValue);
}
return currentValue >= comparisonValue
? new ValidationResult(ErrorMessage)
: ValidationResult.Success;
}
public override string FormatErrorMessage(string name)
{
return base.FormatErrorMessage(name);
}
private decimal GetComparisonValue(string comparisonProperty, ValidationContext validationContext)
{
var property = validationContext.ObjectType.GetProperty(comparisonProperty);
if (property == null)
throw new ArgumentException("Not Found!");
var comparisonValue = (decimal)property.GetValue(validationContext.ObjectInstance);
return comparisonValue;
}
}