如何在mvc中创建自定义电子邮件验证属性

时间:2013-09-13 14:26:17

标签: asp.net-mvc-3

我是mvc的新手.scott展示了如何在mvc中创建自定义[电子邮件]验证属性。这是图片。

enter image description here enter image description here

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为此呈现。

请用示例代码示例向我解释。感谢

1 个答案:

答案 0 :(得分:0)

第一个问题最好用MVC中广泛使用的原理来回答:约定优于配置。这基本上意味着:进行尽可能少的配置,使用最默认的功能。 ASP.NET MVC中的几个示例

  • 文件夹控制器默认包含控制器。
  • 视图的名称与Controller中的Action的名称相对应。
  • 视图所在的文件夹名称与不带'Controller'结尾的控制器名称相对应。
  • 控制器的类名以“ Controller”结尾,在调用控制器时被省略。
  • 与属性相同;类名以“属性”结尾,在使用中被省略
  • 等,等等,等等,

还有更多类似的东西,并且没有配置。是惯例。

第二个问题已经在问题本身中得到部分回答:您不能从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;
});