首页 文章

自定义数据注释 - 客户端验证

提问于
浏览
1

我正在尝试使用我的自定义数据注释进行客户端验证,我遇到的问题是,每当我有一个不需要的实体并提交我的请求(将非必需字段留空)时,客户端部分我的代码开始并尝试验证空白区域!我怎么能避免这种情况?意思是,如果用户没有输入任何内容,那么不进行验证?

谢谢!

客户端代码:

$.validator.addMethod("emailvalid", function (value, element, params) {
var regex = /^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-zA-Z0-9]{1}[a-zA-Z0-9\-]{0,62}[a-zA-Z0-9]{1})|[a-zA-Z])\.)+[a-zA-Z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/;
return regex.test(value);
});
$.validator.unobtrusive.adapters.addBool("emailvalid");

服务器端代码:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class EmailValidAttribute : ValidationAttribute, IClientValidatable 
{
    private Regex Regex { get; set; }
    private string pattern {
        get {
            return @"^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-zA-Z0-9]{1}[a-zA-Z0-9\-]{0,62}[a-zA-Z0-9]{1})|[a-zA-Z])\.)+[a-zA-Z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$";
        }
    }

    public EmailValidAttribute(string errorMessage)
        : base(errorMessage)
    {
        this.Regex = new Regex(this.pattern);
    }

    public override bool IsValid(object value)
    {
        var stringValue = Convert.ToString(value);

        // automatically pass if value is null or empty. RequiredAttribute should be used to assert an empty value
        if (string.IsNullOrWhiteSpace(stringValue))
        {
            return true;
        }

        var m = Regex.Match(stringValue);

        // looking for an exact match, not just a search hit
        return (m.Success && (m.Index == 0) && (m.Length == stringValue.Length));
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ValidationType = "emailvalid";
        rule.ErrorMessage = ErrorMessageString;

        yield return rule;
    }
}

2 回答

  • 2

    你不能在测试正则表达式之前执行简单的验证吗? $ .trim()方法是忽略尾随空格(假设你正在使用jQuery) . 就像是

    $.validator.addMethod("emailvalid", function (value, element, params) {
        if ($.trim(value) == '') return true;
    
        var regex = /^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-zA-Z0-9]{1}[a-zA-Z0-9\-]{0,62}[a-zA-Z0-9]{1})|[a-zA-Z])\.)+[a-zA-Z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/;
        return regex.test(value);
    });
    
  • 1

    添加一个规则,指定不需要输入 .

    有关更多详细信息,请参阅jQuery验证文档:http://jqueryvalidation.org/rules

    你会有这样的事情:

    $( "#myinput" ).rules( "add", {
        required: false
    });
    

    如果输入是空格,您也可以在验证中返回 true ,但由于您已经在使用验证API,因此您也可以使用其内置功能 .

相关问题