1

我是 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如何理解这个电子邮件属性是指向扩展正则表达式属性类的电子邮件属性类。关系将如何扩展。类名是电子邮件属性,但是当他们使用时,他们使用属性名称电子邮件。我不清楚,请解释一下。

2)如果我以上述方式验证电子邮件,他们将在服务器端还是客户端进行验证?

如果不是客户端,那么我如何使它成为客户端,并且将为此渲染所需的 js。

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

4

1 回答 1

0

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

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

类似的还有很多,没有配置。这是约定。

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