【问题标题】:How to change the default ErrorMessage for StringLength attribute in view model with unobtrusive validation如何通过不显眼的验证更改视图模型中 StringLength 属性的默认 ErrorMessage
【发布时间】:2014-06-18 16:55:16
【问题描述】:

默认的 StringLength 验证错误消息对我来说太长了,所以我想缩短它。

我知道我可以为每个属性指定 ErrorMessage,但我不想到处重复:

[StringLength(25, ErrorMessage = "Max length is {1}")]
[DisplayName("Address")]
public virtual string BillAddress1 { get; set; }

基于这篇文章,Modify default ErrorMessage for StringLength validation,我将 StringLengthAttribute 子类化:

public class CustomStringLengthAttribute : StringLengthAttribute
{
    public CustomStringLengthAttribute()
        : this(20)
    {
    }

    public CustomStringLengthAttribute(int maximumLength)
        : base(maximumLength)
    {
        base.ErrorMessage = "Max length is {1}";
    }
}

并改为使用 CustomStringLengthAttribute:

[CustomStringLength(25)]
[DisplayName("Address")]
public virtual string BillAddress1 { get; set; }

这编译得很好,我在 CustomStringLengthAttribute 构造函数中设置了一个断点来验证它是否被命中,但不显眼的验证不再起作用 - 无效数据被发送回控制器。

当我不使用我的子类版本时它工作正常。

另外,这里是 javascript 验证:

if (validation.validateForm($('#addressForm'))) {
    ....
}

验证表单:

function validateForm(form) {
    prepareValidationScripts(form);
    var validator = $.data(form[0], 'validator');
    return validator.form();
}

function prepareValidationScripts(form) {
    if (form.executed)
        return;
    form.removeData("validator");
    $.validator.unobtrusive.parse(document);
    form.executed = true;
}

我错过了什么?

谢谢。

【问题讨论】:

    标签: javascript jquery asp.net-mvc validation


    【解决方案1】:

    试试这个自定义验证。

    CustomStringLengthAttribute.cs

    public class CustomStringLengthAttribute : ValidationAttribute, IClientValidatable
        {
            public int MaximumLength
            {
                get;
                private set;
            }
            public int MinimumLength
            {
                get;
                set;
            }
            public CustomStringLengthAttribute(int maximumLength)
                : base(new Func<string>(CustomStringLengthAttribute.GetDefaultErrorMessage))
            {
                this.MaximumLength = maximumLength;
            }
            private static string GetDefaultErrorMessage()
            {
                return "Max length {1}";
            }
            public override string FormatErrorMessage(string name)
            {
                return string.Format(base.ErrorMessageString, name, this.MaximumLength, this.MinimumLength);
            }
            public override bool IsValid(object value)
            {
                if (value == null)
                {
                    return true;
                }
                string text = (string)value;
                int maximumLength = this.MaximumLength;
                int minimumLength = this.MinimumLength;
                if (maximumLength < 0)
                {
                    throw new InvalidOperationException("The maximum length must be a nonnegative integer.");
                }
                if (minimumLength > maximumLength)
                {
                    throw new InvalidOperationException(string.Format("The maximum value '{0}' must be greater than or equal to the minimum value '{1}'.", maximumLength, minimumLength));
                }
                int length = text.Length;
                return length <= maximumLength && length >= minimumLength;
            }
    
            public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
            {
                var rule = new ModelClientValidationRule();
                rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
                rule.ValidationParameters.Add("max", MaximumLength);
                rule.ValidationParameters.Add("min", MinimumLength);
                rule.ValidationType = "customstringlength";
                yield return rule;
            }
        }
    

    在js文件中:

    /// <reference path="jquery-1.4.4.js" />
    /// <reference path="jquery.validate.js" />
    /// <reference path="jquery.validate.unobtrusive.js" />
    
    if ($.validator && $.validator.unobtrusive) {
    
        $.validator.unobtrusive.adapters.addMinMax("customstringlength", "min","max");
    
        $.validator.addMethod("customstringlength", function (value, element, min,max) {
            if (value) {
                if (value.length<min || value.length>max) {
                    return false;
                }
            }
            return true;
        });
    
    }
    

    模型类:

    [CustomStringLength(25)]
    [DisplayName("Address")]
    public virtual string BillAddress1 { get; set; }
    

    【讨论】:

    • 谢谢,我尝试了你的建议,但它对我来说不太奏效 - 客户端验证现在开始了,但我收到“未捕获的类型错误:无法读取未定义的属性“调用”在 Jquery-1.10.2.js 中(在 Sizzle.matchesSelector 中,行:“var ret = matches.call(elem, expr);”,虽然“matches”不是未定义的)。我不知道如何调试这个 -有什么建议吗?
    • 我将创建一个新问题,其中包含有关自定义验证器问题的更多详细信息。
    • 这个问题的解决方法在这里:stackoverflow.com/questions/24298112/…
    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多