簡體   English   中英

如何在ASP.NET MVC中重置驗證屬性的格式化ErrorMessages?

[英]How to reset the formatted ErrorMessages of the validation attributes in ASP.NET MVC?

我使用了一個自定義驗證屬性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;
    }
}

這是因為您正在使用string.Format(ErrorMessage ?? "", comparisonValue);設置ErrorMessagestring.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM