比较(密码)属性

时间:2011-07-25 15:31:18

标签: asp.net-mvc-3 passwords data-annotations

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

我的问题是如何在“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; }
}

为“密码”和“ComparePassword”生成的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 ”。如果我使用“密码”或“ User_Password ”,则不会执行任何操作 - 不会执行检查。如果我使用“ User.Password ”,则会执行检查,但始终会失败。

我在jQuery中直接这样做没有问题,但是如果可能的话,我更愿意使用[Compare]属性。

2 个答案:

答案 0 :(得分:15)

刚通过StackOverflow和Microsoft Connect找到答案:

请参阅:

http://connect.microsoft.com/VisualStudio/feedback/details/665793/jquery-unobtrusive-validate-equalto-fails-with-compare-attributeJQuery 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修复了它,但我找不到新版本的链接。无论如何,这对我来说同时也适用。希望它有所帮助

答案 1 :(得分: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);
    }