2012-03-01 58 views
1

對於我的用戶版本,我必須確保密碼和重複密碼相同。我找到了「比較」驗證器,但我無法使它工作。Asp.Net MVC 3:在子屬性上比較驗證器?

我的模型如下所示:

public class UserEditionViewModel{ 
    [Compare("User.Password")] 
    public String RepeatPassword{get;set;} 

    public User User {get;set;} 
    public List<Language> AvailableLanguages{get;set;} 
    public List<Country> AvailableCountries{get;set;} 
} 

和用戶模式:

public class User{ 
    [Required] 
    public String Name{get;set;} 

    //lot of other properties omitted... 

    [RegularExpression(@"(|.*(?=.{6,})(?=.*\d)(?=.*[a-zA-Z]).*)", ErrorMessageResourceType = typeof(LocalizationResources.Views.User.Edition), ErrorMessageResourceName = "InvalidPassword")] 
    //And I've localization attributes 
    public String Password{get;set;} 
} 

在視圖中我只碰到這樣的:

@Html.PasswordFor(m=>m.User.Password) 
@Html.PasswordFor(m=>m.RepeatPassword) 

但我得到這個錯誤,即使兩個項目匹配:

'Password repeat' and 'User.Password' do not match. 

我在進行客戶端驗證時也出現此錯誤。

對我來說最明顯的錯誤是它找不到子屬性。我對嗎?如果是的話,如何避免這種行爲。如果不是,會有什麼問題?

回答

1

解決方法是在UserEditionViewModel上創建另一個屬性,讀取和寫入內部User類。

public String UserPassword 
{ 
    get 
    { 
     return User.Password; 
    } 
    set 
    { 
     User.Password = value; 
    } 
} 

,然後綁定您的控件到屬性代替,並更改[Compare("User.Password")][Compare("UserPassword")]。我不確定是否可以通過任何其他方式來編寫自己的自定義驗證器。

我有一個類似的問題,並最終寫了我自己的驗證器,因爲這可以讓你驚訝地複雜,因爲你可以有任何繼承層到你的財產。如果還有其他解決方案,我會同樣高興地瞭解它。

0

你可以試試這個這工作對我來說..

  1. 在項目 - >引用 - >右鍵單擊 - >管理的NuGet包..

  2. 安裝DataAnnotationsExtensions包。

  3. 然後驗證你的模型如下:

    公共類員工 { [必需(的ErrorMessage = 「Name字段必填」)

    public string name { get; set; } 
    [Required(ErrorMessage = "Name field Required")] 
    public string email { get; set; } 
    [Required(ErrorMessage = "Depatrment field Required")] 
    public string department { get; set; } 
    [Required(ErrorMessage = "Designation field Required")] 
    public string designation { get; set; } 
    public string phone { get; set; } 
    [Required(ErrorMessage = "Password field Required")] 
    [Display(Name="Password")] 
    public string password { get; set; } 
    [Required(ErrorMessage="Confirm password")] 
    [Display(Name="Re-type Password")] 
    [EqualToAttribute("password",ErrorMessage="Password miss-match")] 
    public string Re_Password { get; set; } 
    

    }

這它