如何格式化来自自定义验证器的错误消息

问题描述 投票:0回答:1

我已经通过这种方式创建了一个自定义验证器:

public class IntArrayRequiredAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if ((!(value is int[] array) || !array.Any() || array.Any(item => item == 0)))
            return new ValidationResult(this.ErrorMessage);

        return ValidationResult.Success;
    }
}

并将其应用于模型属性:

    [IntArrayRequiredAttribute(ErrorMessage = "You must select {0}.")]
    [Display(Name = "Rol")]
    public int[] Roles { get; set; }

好,当验证失败时,显示此错误:

"You must select {0}."

如何返回错误消息,以便{0}自动被字段的显示名称替换,例如内置的验证器?

预期结果应为"You must select Rol."

编辑:

通过查看ValidationAttribute源代码,我读到:

    public ValidationResult GetValidationResult(object value, ValidationContext validationContext) {
        if (validationContext == null) {
            throw new ArgumentNullException("validationContext");
        }

        ValidationResult result = this.IsValid(value, validationContext);

        // If validation fails, we want to ensure we have a ValidationResult that guarantees it has an ErrorMessage
        if (result != null) {
            bool hasErrorMessage = (result != null) ? !string.IsNullOrEmpty(result.ErrorMessage) : false;
            if (!hasErrorMessage) {
                string errorMessage = this.FormatErrorMessage(validationContext.DisplayName);
                result = new ValidationResult(errorMessage, result.MemberNames);
            }
        }

        return result;
    }

我看到它调用了覆盖的IsValid方法,并格式化了消息。为什么我的格式不格式化?

如果我使用IsValid重载,则其格式正确,但是,我需要使用此方法,因为我需要validateContext来实现其他验证目的。

asp.net-mvc asp.net-mvc-5 data-annotations asp.net-mvc-5.2 validationattribute
1个回答
0
投票

我认为参考源与实际代码不匹配,因为反射表明:

public ValidationResult GetValidationResult(object value, ValidationContext validationContext)
{
    if (validationContext == null)
    {
        throw new ArgumentNullException("validationContext");
    }
    ValidationResult validationResult = IsValid(value, validationContext);
    if (validationResult != null && (validationResult == null || string.IsNullOrEmpty(validationResult.ErrorMessage)))
    {
        string errorMessage = FormatErrorMessage(validationContext.DisplayName);
        validationResult = new ValidationResult(errorMessage, validationResult.MemberNames);
    }
    return validationResult;
}

因此,如果您想使所有内容都适合单个过载

protected override ValidationResult IsValid(object value, ValidationContext validationContext) {...}

您可以让基类执行ErrorMessage格式:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    if ((!(value is int[] array) || !array.Any() || array.Any(item => item == 0)))
    {
       return new ValidationResult(null);
    }

    return ValidationResult.Success;
}

或者您可以自己格式化:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    if ((!(value is int[] array) || !array.Any() || array.Any(item => item == 0)))
    {
        string errorMessage = FormatErrorMessage(validationContext.DisplayName);
        return new ValidationResult(errorMessage);
    }

    return ValidationResult.Success;
}
© www.soinside.com 2019 - 2024. All rights reserved.