Как сбросить отформатированные ErrorMessages атрибутов проверки в ASP.NET MVC? - PullRequest
0 голосов
/ 05 декабря 2018

Я использовал пользовательский атрибут проверки - AmountShouldBeLessOrEqualAttribute - что его процесс проверки связан со значением другого свойства, и этот атрибут работает успешно .

Но в следующем сценарии у меня естьпроблема с ним:

  1. Запустить приложение
  2. Переход на страницу формы
  3. Отправить форму (POST форму для первого раза )
  4. Процесс ModelBinding вызывает форматирование значения ErrorMessage в атрибуте AmountShouldBeLessOrEqual.Например:

    В ViewModel есть свойство Amount с указанным выше атрибутом

    и

    Его ErrorMessage: Your amount should be less than {0}

    Будет преобразовано в: Your amount should be less than 23

    Примечание: 23 - это значение MaxAmount свойства в ViewModel

  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 версиюкаждый раз для форматирования с новым значением?

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;
    }
}

1 Ответ

0 голосов
/ 06 декабря 2018

Это вызвано тем, что вы устанавливаете значение для 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...