我试图在使用jQuery时添加一个单一的、简单的客户端验证规则。我的验证函数从未被调用,警报从未触发。我做错了什么?我已经把它从一个更复杂的MVC应用程序中去掉了。
<html>
<head>
<script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.3.min.js"></script>
<script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.13.1/jquery.validate.js"></script>
<script src="//ajax.aspnetcdn.com/ajax/mvc/5.2.3/jquery.validate.unobtrusive.js"></script>
<script>
jQuery.validator.addMethod("mysplit", function () {
alert("in validator");
return false;
}, "Barf");
result = jQuery.validator.unobtrusive.adapters.addBool("mysplit");
</script>
</head>
<body>
<form method="post">
<input type="text" data-val="True", data-val-mysplit="error msg" />
<input type="submit" />
</form>
</body>
</html>不确定这对于一个简单的.htm文件是否重要,但在我的web.config中,一切看起来都是正确的:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="ValidationSettings:UnobtrusiveValidationMode" value="none" />发布于 2015-10-13 22:08:11
我仍然无法装饰HTML元素,以使它与不引人注目的验证一起工作。看起来,如果您没有自定义规则的适配器,那么手动添加不引人注目的HTML属性将无法工作。然而,我确实发现,您可以修饰要由jQuery.validate直接验证的元素(或多或少跳过了不引人注目的验证)。我不知道用这种方式手动添加jQuery.validation数据属性是否会与通过非突出方式进行的验证发生冲突,例如,如果您在元素上有一个必需的属性,该属性将被非突兀性转换为“data”属性。
简而言之,您可以使用通常的jQuery.validator.addMethod()添加一个客户端验证方法,然后使用适当的数据规则属性(而不是数据-val,这是不显眼的用法)触发它。例如,为了验证输入字段的值为"hello",我可以添加一个规则:
jQuery.validator.addMethod("hello", function (value, element, params) {
return this.optional(element) || /^hello$/.test(value);
});注意:不要将错误消息param添加到addMethod中,如果使用它,它将与@Html.ValidationMessageFor()冲突。
然后手动地装饰HTML元素如下:
@Html.EditorFor(model => model.sendOn, new
{
htmlAttributes = new
{
data_rule_hello="true"
}
})任何jQuery.validate都会开火。
注意,尝试使用数据规则模式=“hello”只是拒绝为我工作,所以我选择了addMethod()路由。
在我的例子中,切换完全脱离了不引人注目的状态,因为我无法验证这一个输入,这比在这里或那里对一个或两个输入元素进行自定义验证要糟糕得多。
这篇文章是揭露数据规则魔法的关键。
我还没有弄清楚这种技术是否会在生产中造成任何严重的问题,但它似乎对我是有效的。
我还建议人们考虑为自己的模型属性编写自定义适配器,如果他们需要自定义验证,而不是像这样的一次性黑客。
https://stackoverflow.com/questions/33094111
复制相似问题