我正在努力使客户端验证与我的自定义数据注释一起工作,我面临的问题是,每当我有一个不需要的实体并提交我的请求(将非必需字段留空)时,我的代码的客户端部分启动并尝试验证空白区域!我怎么能避免这种情况? 意思是,如果用户没有输入任何内容,那么不进行验证?
谢谢!
客户端代码:
$.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;
}
}
答案 0 :(得分: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 :(得分:1)
添加一条规则,指定不需要输入。
有关详细信息,请参阅jQuery验证文档:http://jqueryvalidation.org/rules
你会有这样的事情:
$( "#myinput" ).rules( "add", {
required: false
});
如果输入是空格,您也可以在验证中返回true
,但由于您已经在使用验证API,因此您也可以使用其内置功能。</ p>