我有一個自定義的數據驗證屬性,我已經創建,以確保用戶輸入的密碼相同,但從不調用IsValid。自定義數據註釋IsValid永遠不會被調用。 (ASP.NET MVC 2 .NET 4)
自定義屬性:
public class IsSameAsAttribute : ValidationAttribute
{
public String TargetProperty { get; set; }
private readonly object _typeId = new object();
public IsSameAsAttribute(string targetProperty)
{
TargetProperty = targetProperty;
}
public override bool IsValid(object value)
{
return false;
//Type objectType = value.GetType();
//bool isValid = false;
//PropertyInfo[] neededProperties =
// objectType.GetProperties().Where(propertyInfo => propertyInfo.Name == TargetProperty).ToArray();
//return isValid;
}
public override object TypeId
{
get { return _typeId; }
}
}
數據模型將它應用到:
public class RegistrationData
{
[Required(ErrorMessage = "First Name Required")]
[StringLength(100, ErrorMessage = "First Name must be 100 characters or less.")]
public String FirstName { get; set;}
[Required(ErrorMessage = "Last Name Required")]
[StringLength(100, ErrorMessage = "Last Name must be 100 characters or less.")]
public String LastName { get; set; }
[Required(ErrorMessage = "Email is Required")]
[StringLength(200, ErrorMessage = "Email must be 200 characters or less.")]
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Valid Email Address is required.")]
public String Email { get; set; }
[Required(ErrorMessage = "Password is required")]
public String Password { get; set; }
[IsSameAs("Password")]
public String PasswordRepeat { get; set; }
[Required(ErrorMessage = "Division is required")]
public String Division { get; set; }
}
而且,它從叫做控制器:
[HttpPost]
public ActionResult ValidationDemo(RegistrationData model)
{
if (ModelState.IsValid)
{
return Redirect("/");
}
return View(model);
}
所有「開箱即用」的驗證操作都是正確的,它只是我自定義的一個,沒有被調用。在進行調試時,我發現它在調用構造函數時被實例化,但IsValid上的斷點永遠不會被打中。
怎麼回事,我該如何解決?
UPDATE
好吧,我擺弄一些,如果我在我的控制器調用TryUpdateModel(模型),它最終調用的IsValid。所以這意味着我的自定義屬性沒有得到任何運行MVC 2驗證的「註冊」。有沒有辦法解決這個問題?
[HttpPost]
public ActionResult ValidationDemo(RegistrationData model)
{
TryValidateModel(model); // <--- *** Added this line and it "works"
if (ModelState.IsValid)
{
return Redirect("/");
}
return View(model);
}
你有沒有註冊一個適配器與你的自定義驗證屬性一起使用'DataAnnotationsModelValidatorProvider.RegisterAdapter'? – 2011-05-10 21:44:35