[英]How to reset the formatted ErrorMessages of the validation attributes in ASP.NET MVC?
我使用了一個自定義驗證屬性AmountShouldBeLessOrEqualAttribute
該驗證屬性的驗證過程與另一個屬性的值有關,並且此屬性成功運行 。
但是在以下情況下,我遇到了問題:
通過ModelBinding
過程,將格式化AmountShouldBeLessOrEqual
屬性中ErrorMessage
的值。 例如:
在
ViewModel
,具有上述屬性的Amount
屬性和
其錯誤消息:
Your amount should be less than {0}
將轉換為:
Your amount should be less than 23
注意:
23
是ViewModel
中MaxAmount
屬性的值
現在我將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
版本?
在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;
}
}
這是因為您正在使用string.Format(ErrorMessage ?? "", comparisonValue);
設置ErrorMessage
值string.Format(ErrorMessage ?? "", comparisonValue);
。 ErrorMessage
是[AmountShouldBeLessOrEqual(nameof(MaxAmount), ErrorMessage = "Your amount should be less than {0}")]
,在IsValid
期間不應更改此值。
嘗試在IsValid
定義作用域變量以存儲格式化的錯誤消息。
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
string error = "";
var currentValue = (decimal)value;
var comparisonValue = GetComparisonValue(_comparisonProperty, validationContext);
if (ErrorMessage == null && ErrorMessageResourceName == null)
{
ErrorMessage = "Amount is large";
}
else
{
error = string.Format(ErrorMessage ?? "", comparisonValue);
}
return currentValue >= comparisonValue
? new ValidationResult(error)
: ValidationResult.Success;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.