[英]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.