2012-03-01 49 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; } 
    

    }

这它