2013-10-31 56 views
1

我想让客户端验证与我的自定义数据注解一起工作,我面临的问题是,每当我有一个非必需的实体并提交我的请求(离开NON - 必填字段空白),我的代码的客户端部分踢进来,并尝试验证空白!我怎样才能避免这种情况? 含义,如果用户没有输入任何内容,那么不要验证?自定义数据注释 - 客户端验证

谢谢!

客户端代码:

$.validator.addMethod("emailvalid", function (value, element, params) { 
var regex = /^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~][email protected]((((([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\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~][email protected]((((([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

难道你只是在测试正则表达式之前执行一个简单的验证吗? $ .trim()方法是忽略尾随空格(假设你正在使用jQuery)。 类似于

$.validator.addMethod("emailvalid", function (value, element, params) { 
    if ($.trim(value) == '') return true; 

    var regex = /^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~][email protected]((((([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); 
}); 
+0

完全忘记了这样一个真棒功能,修剪!谢谢你,完美的作品:) – Jose

+1

如果你的目标用户满足浏览器要求(IE9 +),你可以使用内建的'String.trim()'函数。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim – Vache

1

添加指定的输入不需要的规则。

见jQuery验证文档了解更多信息:http://jqueryvalidation.org/rules

你有这样的事情:

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

您也可以在您的验证返回true如果输入的是空白,但因为你”您已经使用验证API,您可能会使用其内置功能。

+0

您正在使用jquery选择器,这将如何转换为我的代码?我不希望它只与一个元素紧密耦合,但我想要为所有类型为email的所有实体定义规则 '' – Jose

+1

说“空字符串是一个有效的电子邮件地址”邮件“和”空字符串不是有效的电子邮件,但这个字段不是必需的“。我更愿意将这两个概念分开,但如果你永远不会需要电子邮件,我认为确实将它包含在验证中会更容易。 – Vache

+0

我明白你的意思了。是否有可能使用$ .validator ...来定义这样的规则? – Jose

相关问题