第一个问题最好用 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;
});