【问题标题】:How to reset the formatted ErrorMessages of the validation attributes in ASP.NET MVC?如何在 ASP.NET MVC 中重置验证属性的格式化错误消息?
【发布时间】:2018-12-06 14:11:56
【问题描述】:

我使用了自定义验证属性 -AmountShouldBeLessOrEqualAttribute- 它的验证过程与另一个属性的值相关,并且此属性成功工作。

但在以下情况下我遇到了问题:

  1. 启动应用程序
  2. 进入表单页面
  3. 提交表单(发布表单第一次
  4. ModelBinding 进程导致AmountShouldBeLessOrEqual 属性中ErrorMessage 的值被格式化。例如:

    ViewModel 中有一个具有上述属性的Amount 属性

    它的错误消息:Your amount should be less than {0}

    将转换为:Your amount should be less than 23

    注意:23ViewModelMaxAmount 属性的值

  5. 现在我将MaxAmount 更改为83

  6. 我们再次进入表单页面并提交表单
  7. 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


【解决方案1】:

这是因为您将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;
    }

【讨论】:

  • 您指出的提示是正确的。我检查了它。现在可以使用了...谢谢
猜你喜欢
  • 1970-01-01
  • 2020-04-04
  • 2020-07-18
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多