【发布时间】:2018-12-06 14:11:56
【问题描述】:
我使用了自定义验证属性 -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;
}
}
【问题讨论】:
-
或许可以试试这个:stackoverflow.com/a/33050092/1258525
-
@BrianOgden,不,问题出在服务器端,
Error Message在第一次提交表单后在服务器端格式化。当我在IsValid方法中添加BreakPoint时,我看到MaxAmount充满了83,但格式化的消息不允许使用它生成正确的错误消息。
标签: c# asp.net-mvc asp.net-core model-validation