比较(密码)属性
我想使用下面的代码为新用户创建一个视图模型。 “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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
刚刚通过 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 文件中的以下行。
在
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.
to
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
我使用两个字段并在服务器上进行比较(通过不显眼的 JavaScript)修复了这个问题:
服务器端代码:
I fixed this issue using two fields and comparing on server (via unobtrusive JavaScript):
Server-side code: