2010-06-29 52 views
7

我有一個自定義的數據驗證屬性,我已經創建,以確保用戶輸入的密碼相同,但從不調用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); 
} 
+1

你有沒有註冊一個適配器與你的自定義驗證屬性一起使用'DataAnnotationsModelValidatorProvider.RegisterAdapter'? – 2011-05-10 21:44:35

回答

0

你試過填寫所有其他字段,以便所有外的開箱驗證滿意,看看您的自定義的驗證被觸發? 如果客戶端驗證不滿意,表單將被阻止回發,從而您的服務器端自定義驗證不會被激怒,

要使您的自定義驗證屬性在客戶端工作,一些額外的工作有被製造。

上驗證這裏閱讀上菲爾的優秀帖子: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

+0

目前,我沒有進行客戶端驗證,試圖使其發揮作用。至少我不認爲我是。嗯,我應該檢查一下。但是,我在控制器中運行ModelState.IsValid中的斷點,並且模型的錯誤集合從未出現錯誤狀態,這是我的自定義驗證項目。 是的,在更新之前,我填寫了表單,但仍未觸發自定義驗證屬性。 :( – Jack 2010-06-29 23:03:28

+0

嗯,所以我的假設是錯誤的,這真的很奇怪。你可以爲你發佈代碼[HttpGet]方法和視圖嗎? – 2010-06-29 23:34:32

3

我看到有MVC2類似/相同/相關的問題 - 類級別的驗證被稱爲只有所有屬性正確驗證。

因此,多個屬性可能會失敗,並且所有驗證消息都會添加到模型狀態(並顯示在客戶端上)。但是類級驗證消息不在其中;只有屬性通過時纔會調用這些IsValid。從可用性的角度來看,這有點令人失望,但它起作用。

我是而不是調用TryValidateModel()。

相關問題