[英]MVC 5 custom validation attribute not triggered
所以我一直在这里用头撞墙。 我按照这封信的教程进行操作,但我不知道为什么此自定义验证不起作用。 它应该验证电话号码。
短到最后
自定义属性:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public sealed class CustomPhoneAttribute : DataTypeAttribute, IClientValidatable
{
private static readonly string[] ddds = new[] { ... };
private static Regex regex = new Regex(@"^(\([0-9]{2}\)) ([0-9]{5}-[0-9]{4}|[0-9]{4}-[0-9]{4}$", RegexOptions.Compiled);
private const string DefaultErrorMessage = "{0} must be a phone number.";
public CustomPhoneAttribute()
: base(DataType.PhoneNumber)
{
ErrorMessage = DefaultErrorMessage;
}
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name);
}
private bool ValidatePhone(string phone)
{
if (regex.Match(phone).Success)
{
var ddd = phone.Substring(1, 2);
if (ddds.Contains(ddd))
{
var phoneParts = phone.Substring(5).Split('-');
}
// TODO: perform further evaluation base on
// ddd, first digit and extra 9.
// For now we only check the ddd exists.
return true;
}
return false;
}
public override bool IsValid(object value)
{
if (value == null)
{
return true;
}
return ValidatePhone((string)value);
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule()
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "brphone"
};
}
模型:
{...}
[CustomRequired] // this works.
[DataType(DataType.PhoneNumber)]
[Display(Name = "Phone")]
[CustomPhone]
public string Phone { get; set; }
{...}
Javascript:
$.validator.addMethod("brphone",
function (value, element) {
if (!this.optional(element)) {
// perform validation.
return true;
}
return true;
});
$.validator.unobtrusive.adapters.addBool("brphone");
看法:
@Html.TextBoxFor(m => m.Phone, new { @class = "form-control phonemask-client", placeholder = "(xx) xxxxx-xxxx" })
一切似乎都已检查完毕,但服务器端和客户端验证仍然无法正常工作。
找出其中的一部分(可能是微软的错误)
如果我从数据注释类中删除正则表达式对象,它就像一个魅力。 现在,为什么会这样,我不知道! 如果我附加了一个调试器,当它遇到正则表达式声明时,我单击 step over 继续调试,程序只是返回到网页,什么也没有发生。
是否禁止在数据注释中使用正则表达式?
您的正则表达式中缺少括号,这会在实例化属性时导致错误。
// missing ')' between the {4} and $
private static Regex regex = new Regex(@"^(\([0-9]{2}\)) ([0-9]{5}-[0-9]{4}|[0-9]{4}-[0-9]{4})$", RegexOptions.Compiled);
由于字段上的static
关键字,我们在运行时没有看到错误。
让我们假设您的属性如下所示:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public sealed class CustomPhoneAttribute : DataTypeAttribute
{
public static string MyString = GetValue();
public CustomPhoneAttribute()
: base(DataType.PhoneNumber)
{
}
private static string GetValue()
{
throw new Exception();
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return base.IsValid(value, validationContext);
}
}
使用static
关键字时,运行时需要在实例化类本身之前的某个时间点初始化类型级值。 但是,发生这种情况时会导致崩溃,因为GetValue
代码抛出异常。 当 MVC 查看模型中的数据注释时,会发生该错误,并且它将依次忽略该属性(因为它无法实例化)。
通过删除static
关键字,当注解被实例化时,你会在构造函数中抛出错误,所以它首先被抛出到你的代码中,调试器可能会中断它。
解决了。 问题出在正则表达式中。 它缺少一个结束的“)”。 可笑的是,我没有得到例外。
所以:
@"^(\([0-9]{2}\)) ([0-9]{5}-[0-9]{4}|[0-9]{4}-[0-9]{4}$"
变成
@"^(\([0-9]{2}\)) ([0-9]{5}-[0-9]{4}|[0-9]{4}-[0-9]{4})$"
为了找出异常,我不得不在另一个项目中实现注释。 作为图书馆。 然后,我将 dll 添加到我当前的项目中并尝试使用它。 我收到一个黄页,说我的正则表达式错误。
这个异常应该是从我自己的代码中抛出的,嗯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.