jQuery不显眼的验证 - 无法添加简单的自定义客户端验证规则

时间:2015-10-13 04:26:00

标签: unobtrusive-validation asp.net-mvc-5.2

我正在尝试添加一个简单的仅限客户端验证规则,同时使用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" />

1 个答案:

答案 0 :(得分:0)

我仍然无法修饰HTML元素以使其与不显眼的验证一起使用。看来,如果您没有自定义规则的适配器,那么手动添加不显眼的HTML属性将不起作用。但是我确实发现你可以通过jQuery.validate来装饰要直接验证的元素(或多或少地跳过不显眼的验证)。我不知道手动添加jQuery.validation数据属性是否会与不显眼的验证冲突,例如,如果你有一个[Required]属性被转换为&#34;数据-Val&#34;属性不引人注目。

简而言之,您可以使用通常的jQuery.validator.addMethod()添加客户端验证方法,然后使用正确的数据规则属性( data-val,这是不显眼的用途)触发它。例如,要验证输入字段的值是否为&#34; hello&#34;,我可以添加规则:

jQuery.validator.addMethod("hello", function (value, element, params) {
    return this.optional(element) || /^hello$/.test(value);
});

注意:不要将错误消息参数添加到addMethod,如果您使用它,它将与@ Html.ValidationMessageFor()冲突。

然后手动装饰您的HTML元素,如:

@Html.EditorFor(model => model.sendOn, new
{
    htmlAttributes = new
    {
        data_rule_hello="true"
    }
})

任何jQuery.validate都会触发。

请注意,尝试使用data-rule-pattern =&#34; hello&#34;只是拒绝为我工作所以我去了addMethod()路线。

在我的情况下,只是因为我无法验证这一输入是完全远离不引人注意的转换是一个更糟糕的选择比这个或那里的一个或两个输入元素的自定义验证

This article是暴露数据规则魔力的关键。

我还没有发现这种技术是否会导致生产中出现任何严重问题,但它似乎对我有用。

我还建议人们考虑为自己的模型属性编写自定义适配器,如果他们需要自定义验证而不是像这样的一次性黑客。