gpt4 book ai didi

asp.net-mvc-3 - 客户端验证未触发 CompareAttribute DataAnnotation

转载 作者:行者123 更新时间:2023-12-04 16:49:17 24 4
gpt4 key购买 nike

我正在布置一个比较两个密码字符串的 View 。我的一个模型中的两个属性非常简单:

    [Required]
[RegularExpression(@"(\S)+", ErrorMessage = "White space is not allowed")]
[StringLength(20, MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "New Password")]
public string NewPassword { get; set; }

[Required]
[DataType(DataType.Password)]
[RegularExpression(@"(\S)+", ErrorMessage = "White space is not allowed")]
[StringLength(20, MinimumLength = 6)]
[Display(Name = "Confirm Password")]
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }

这是我的 View 代码:
<table class="fieldset center" width="400">
<tbody>
<tr>
<th width="150">
@Html.LabelFor(m => m.NewPassword)
</th>
<td>
@Html.PasswordFor(m => m.NewPassword, new { @class = "itext3" })
<br /><br />@Html.ValidationMessageFor(m => m.NewPassword)
</td>
</tr>
<tr>
<th width="150">
@Html.LabelFor(m => m.ConfirmPassword)
</th>
<td>
@Html.PasswordFor(m => m.ConfirmPassword, new { @class = "itext3" })
<br /><br />@Html.ValidationMessageFor(m => m.ConfirmPassword)
</td>
</tr>
</tbody>
</table>

所有属性在测试时都会触发它们的客户端验证消息,除了 ConfirmPassword 上的 CompareAttribute,它在我点击服务器之前不会触发。但是,在我的 Controller 中,ModelState.IsValid = false。

我将我正在做的事情与正常工作的默认 MVC 应用程序进行了比较。有关故障排除和解决此问题的任何建议吗?

我正在使用 MVC 3 RTM。

最佳答案

jquery.validate.unobtrusive.js(和jquery.validate.unobtrusive.min.js,缩小版)中有一个BUG。仅当 compare-to 字段是表单上的第一个字段时,由 [Compare] 属性发出的客户端验证才会起作用。要修复此错误,请在 jquery.validate.unobtrusive.js 中找到此行:

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

这导致了这个等价物:
element = $(options.form).find(":input[name=MyExample.Control]")[0];

不幸的是,这不是 find() 的正确语法,并导致它引用表单上的第一个输入控件。

将该行更改为:
element = $(options.form).find(":input[name='" + fullOtherName + "']")[0];

这导致了这个等价物:
element = $(options.form).find(":input[name='MyExample.Control]'")[0];

这是正确的语法,并且正确匹配具有指定名称的输入控件。

在 jquery.validate.unobtrusive.min.js 中找到相同的代码块,如下所示:
f=a(b.form).find(":input[name="+d+"]")[0];

并将其更改为:
f=a(b.form).find(":input[name='"+d+"']")[0];

关于asp.net-mvc-3 - 客户端验证未触发 CompareAttribute DataAnnotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4696276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com