我是mvc的新手.scott展示了如何在mvc中创建自定义[电子邮件]验证属性。这是图片。
http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx
1)现在看看他们是如何做到的。首先创建一个类给出一个名称并扩展正则表达式属性类,并在其ctor中使用正则表达式来验证电子邮件地址
我的问题是他们何时使用[Email(Errormessage =“blah blah”)]
然后MVC如何理解这个电子邮件属性指向电子邮件属性类,它扩展了regularrexpression属性类。如何建立关系将是一种关系。类名是电子邮件属性,但是当他们使用时,他们使用attribite名称电子邮件。这个我不清楚请解释。
2)如果我以上述方式验证电子邮件,那么验证将发生在服务器端还是客户端?
如果不是客户端那么我怎样才能使客户端和所需的js为此呈现。
请用示例代码示例向我解释。感谢
答案 0 :(得分:0)
第一个问题最好用MVC中广泛使用的原理来回答:约定优于配置。这基本上意味着:进行尽可能少的配置,使用最默认的功能。 ASP.NET MVC中的几个示例
还有更多类似的东西,并且没有配置。是惯例。
第二个问题已经在问题本身中得到部分回答:您不能从EmailAddressAttribute继承,因为它是密封类。但是你可以使用 RegularExpressionAttribute可以在问题中描述,也可以创建一个新属性,就像我在下面做的那样。
但是,通过这种方式,验证只能在服务器端进行。要使其在客户端上,您需要执行以下操作:
public class EmailAttribute : ValidationAttribute, IClientValidatable
{
private const string VALIDATION_TYPE = "customEmail";
private const string EMAIL_REGEX = @"put your regex here";
public virtual IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule { ValidationType = VALIDATION_TYPE, ErrorMessage = ErrorMessageString };
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var sValue = value as string;
if (!string.IsNullOrEmpty(sValue) && Regex.Match(sValue, EMAIL_REGEX).Success)
{
return ValidationResult.Success;
}
return new ValidationResult(string.Format(ErrorMessageString, validationContext.MemberName));
}
}
然后用Javascript(我想您已经包括jQuery,jQuery.validate和jQuery.validate.unobtrusive)使用以下内容:
$.validator.addMethod('customEmail', function (value, element) {
let regex = /put your regex here/;
return regex.test($(element).val());
});
$.validator.unobtrusive.adapters.add('customEmail', [], function (options) {
options.messages['customEmail'] = options.message;
options.rules['customEmail'] = options.params;
});