比较(密码)属性

发布于 2024-11-26 04:41:06 字数 1530 浏览 2 评论 0原文

我想使用下面的代码为新用户创建一个视图模型。 “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; }
}

为“Password”和“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] 属性。

I'd like to create a view model for a new user using the code below. The "User" class contains just the two properties (simplified for now) that I will persist to the database; the view model adds a "compare password" field, which is only used in the view. I'd prefer to have the view model use the "User" class directly, rather than repeating all of the fields defined in "User".

My question is how do I properly reference "User.Password" in the [Compare] attribute for the "ComparePassword" field?

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; }
}

The HTML that gets generated for "Password" and "ComparePassword" is below.

<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="" />

The key is how the "data-val-equalto-other" is handled by the Javascript. If I use "Password" or "User_Password" nothing happens - no check is performed. If I use "User.Password" the check is performed but always fails.

I have no real problem doing this directly in jQuery, but would prefer to use the [Compare] attribute if at all possible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

毁梦 2024-12-03 04:41:06

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

请参阅:

http://connect.microsoft.com/VisualStudio/feedback/details/665793/jquery-unobtrusive-validate-equalto-fails-with-compare-attribute

JQuery 1.5 中断比较验证(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 已修复它,但我找不到新版本的链接。无论如何,这同时对我有用。希望有帮助

Just found the answer via StackOverflow and Microsoft Connect:

See:

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

To summerize, it looks like a bug in the jquery.validate.unobtrusive file that came with MVC3. The workaround is changing the following line in the jquery.validate.unobtrusive file.

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

to

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

On Microsoft Connect, it says MS has fixed it, but i couldnt find the link to the new version. Anyways, this works for me in the meantime. Hope it helps

疏忽 2024-12-03 04:41:06

我使用两个字段并在服务器上进行比较(通过不显眼的 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);
    }

I fixed this issue using two fields and comparing on server (via unobtrusive 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; }

Server-side code:

    [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);
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文