比较(密码)属性

Posted

技术标签:

【中文标题】比较(密码)属性【英文标题】:Compare (password) attribute 【发布时间】:2011-07-25 15:31:17 【问题描述】:

我想使用下面的代码为新用户创建一个视图模型。 “用户”类仅包含我将持久保存到数据库的两个属性(现在已简化);视图模型添加了一个“比较密码”字段,该字段仅在视图中使用。我宁愿让视图模型直接使用“用户”类,而不是重复“用户”中定义的所有字段。

我的问题是如何在“ComparePassword”字段的 [Compare] 属性中正确引用“User.Password”?

public class User

   [Required]
   public string UserName  get; set; 

   [Required]
   [DisplayName("Password")]
   [DataType(DataType.Password)]
   public string Password  get; set; 

public class NewUserViewModel

    public User User  get; set; 

    [Required]
    [DataType(DataType.Password)]
    [DisplayName("Re-enter Password")]
    [Compare("Password", ErrorMessage="Passwords must match")]
    public string ComparePassword  get; set; 

为“密码”和“比较密码”生成的 html 如下。

<input class="text-box single-line password" 
  data-val="true" 
  data-val-required="The Password field is required." 
  id="User_Password" 
  name="User.Password" 
  type="password" value="" />

<input class="text-box single-line password" 
  data-val="true" 
  data-val-equalto="Passwords must match" 
  data-val-equalto-other="*.Password"
  data-val-required="The Re-enter Password field is required." 
  id="ComparePassword" 
  name="ComparePassword" 
  type="password" value="" />

关键是javascript如何处理“data-val-equalto-other”。如果我使用“Password”或“User_Password”没有任何反应 - 不执行任何检查。如果我使用“User.Password”,则会执行检查但总是失败。

直接在 jQuery 中执行此操作没有真正的问题,但如果可能的话,我更愿意使用 [Compare] 属性。

【问题讨论】:

我遇到了完全相同的问题(我正在使用 FluentValidation,尽管问题似乎相同)。运气好吗? 我正在做同样的事情,这对我不起作用。它说“[ViewModel].User.Password”不存在,并在表单显示之前引发运行时错误。我有一个视图模型,其中用户作为属性,密码作为其下方的字符串属性。有什么想法吗? 【参考方案1】:

刚刚通过 *** 和 Microsoft Connect 找到了答案:

见:

http://connect.microsoft.com/VisualStudio/feedback/details/665793/jquery-unobtrusive-validate-equalto-fails-with-compare-attribute 和 JQuery 1.5 breaks Compare Validate (JQuery Validate 1.8)

总结一下,它看起来像是 MVC3 附带的 jquery.validate.unobtrusive 文件中的一个错误。解决方法是更改​​ jquery.validate.unobtrusive 文件中的以下行。

element = $(options.form).find(":input[name=" + fullOtherName + "]")[0];

element = $(options.form).find(":input[name=" + fullOtherName.replace(".", "\\.") + "]")[0];

在 Microsoft Connect 上,它说 MS 已修复它,但我找不到新版本的链接。无论如何,这同时对我有用。希望对你有帮助

【讨论】:

微软似乎终于修复了它。我将 jQuery.Validation 包从 1.9 更新到 1.9.0.1,它对我有用。 完美,感谢您的更新。我终于可以升级我的黑客版本了:) 我试图让它工作,但是我的 "[Compare("User.Password")] 即使使用最新的 jQuery 文件仍然无法工作【参考方案2】:

我使用两个字段修复了这个问题,并在服务器上进行了比较(通过不显眼的 JavaScript):

    [Required(ErrorMessage = @"The new password is required")]
    [StringLength(25, ErrorMessage = @"The new password must be at least 2 characters long", MinimumLength = 4)]
    [DataType(DataType.Password)]
    [Display(Name = @"New Password")]
    public string NewPassword  get; set; 

    [Required(ErrorMessage = @"The confirmation of password is required")]
    [StringLength(25, ErrorMessage = @"The confirmation of new password must be at least 2 characters long", MinimumLength = 4)]
    [DataType(DataType.Password)]
    [Display(Name = @"Confirm New Password")]
    public string ConfirmPassword  get; set; 

服务器端代码:

    [HttpPost]
    public ViewResult ChangeUserPassword(ChangePasswordModel model)
    
        Logger.Debug(LogBuilder.MethodEntry("ChangeUserPassword"));

        if (model == null)
        
            throw new ArgumentNullException("model");
        

        if (model.NewPassword != model.ConfirmPassword)
        
            ModelState.AddModelError("", Messages.ConfirmPasswordError);

            return View(model);
        

        if (ModelState.IsValid)
        
            var changePasswordCompleted = false;

            try
            
                var userName = CurrentPerson.UserDetails.UserName;
                var membershipUser = Membership.GetUser(userName);

                if (membershipUser != null)
                
                    changePasswordCompleted = membershipUser.ChangePassword(model.OldPassword, model.NewPassword);
                
            
            catch (Exception exception)
            
                changePasswordCompleted = false;

                Logger.Error(LogBuilder.LogMethodError("ChangeUserPassword", exception));
            

            if (changePasswordCompleted)
            
                return View("ChangePasswordCompleted");
            
        

        ModelState.AddModelError("", Messages.ChangePasswordError);

        return View(model);
    

【讨论】:

以上是关于比较(密码)属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 DataAnnotations 比较两个模型属性

如何修复 TypeError:在使用 bcryptjs 对 GraphQL 突变进行哈希密码期间无法读取未定义的属性“哈希”?

为表增加列属性方法探究

密码字段未禁用自动完成 HTML 属性

spring security ldap隐藏密码属性

转载啥,又要为表增加一列属性?