Ненавязчивая проверка jQuery - невозможно добавить простое пользовательское правило проверки клиента

Я пытаюсь добавить одно простое правило проверки только для клиента, используя 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" />

person Eric Sassaman    schedule 13.10.2015    source источник


Ответы (1)


Я все еще не могу украсить HTML-элемент, чтобы он работал с ненавязчивой проверкой. Похоже, что если у вас нет адаптера для вашего пользовательского правила, то добавление ненавязчивых HTML-атрибутов вручную не сработает. Однако я обнаружил, что вы можете украшать элементы для проверки непосредственно с помощью jQuery.validate (более или менее пропуская ненавязчивую проверку). Я не знаю, будет ли ручное добавление атрибутов данных jQuery.validation таким образом конфликтовать с проверкой, выполненной ненавязчивой, если у вас есть, например, атрибут [Required] для элемента, который преобразуется в атрибуты «data-val» с помощью ненавязчивый.

Короче говоря, вы можете добавить метод проверки клиента с помощью обычного jQuery.validator.addMethod(), а затем активировать его с соответствующими атрибутами правила данных (не data-val, который используется ненавязчиво). Например, чтобы убедиться, что поле ввода имеет значение «привет», я могу добавить правило:

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="hello" просто отказала мне в работе, поэтому я пошел по маршруту addMethod().

В моем случае полностью отказаться от ненавязчивого только потому, что я не могу проверить этот один вход, это гораздо худший вариант, чем этот небольшой хак, чтобы выполнить мою пользовательскую проверку элемента ввода или двух здесь или там.

Эта статья была ключевой чтобы разоблачить магию правил данных.

Мне еще предстоит выяснить, вызывает ли этот метод какие-либо серьезные проблемы в производстве, но, похоже, он работает для меня.

Я бы также порекомендовал людям подумать о написании собственного адаптера для своих собственных атрибутов модели, если им нужна пользовательская проверка вместо одноразового взлома, подобного этому.

person Eric Sassaman    schedule 13.10.2015