MVC Добавление методов в jquery.validate.unobtrusive.js

Недавно у меня возник вопрос о запуске проверки флажка на стороне клиента в проекте MVC. На этот вопрос был успешно дан ответ, но возник другой вопрос.

Чтобы моя проверка флажка работала, мне нужно было добавить следующие биты javascript непосредственно в jquery.validate.unobtrusive.js:

$jQval.addMethod("mustbetrue", function (value, element, param) {
    // check if dependency is met
    if (!this.depend(param, element))
        return "dependency-mismatch";
    return element.checked;
});

adapters.add("mustbetrue", function (options) {
    setValidationValues(options, "mustbetrue", true);
});

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

Имея это в виду, я попытался добавить это во внешний файл javascript:

$.validator.addMethod("mustbetrue", function (value, element, param) {
    // check if dependency is met
    if (!this.depend(param, element))
        return "dependency-mismatch";
    return element.checked;
});

$.validator.unobtrusive.adapters.add("mustbetrue", function (options) {
    setValidationValues(options, "mustbetrue", true);
});

К сожалению, теперь клиентский скрипт на моих флажках не запускается. Может ли кто-нибудь увидеть, что я делаю неправильно?

заранее спасибо

S


person Sniffer    schedule 04.08.2011    source источник


Ответы (3)


Сниффер,

Чем больше я смотрю на это, тем больше качаю головой (на себя).

При дальнейшем рассмотрении метод Дарина будет работать при условии, что вы добавите одну строку в сценарий его страницы:

<script type="text/javascript">
    $.validator.unobtrusive.adapters.addBool("mustbetrue", "required");
    $.validator.unobtrusive.parse();
</script>

Всякий раз, когда вы вносите изменения (например, добавляете новый адаптер), вы должны повторно анализировать ненавязчивые атрибуты проверки. Поскольку последним действием в jquery.validate.unobtrusive.js является анализ атрибутов, а адаптер добавляется после анализа, повторный анализ решает эту проблему.

советник

P.S. Это решает вашу проблему, но по-прежнему оставляет нерешенным вопрос о том, как добавить другие пользовательские валидаторы, которые не используют встроенные методы из jquery.validate.js, не изменяя jquery.validate.unobtrusive.js.

П.П.С. Я нашел ответ для добавления пользовательских методов проверки. Чтобы добавить пользовательские методы проверки без изменения jquery.validate.unobtrusive.js, вам нужно «позаимствовать» часть его кода для добавления в скрипт вашей страницы. Добавление пользовательского метода выглядит следующим образом:

<script type="text/javascript">
    var $jQval = $.validator,
        adapters,
        data_validation = "unobtrusiveValidation";

    function setValidationValues(options, ruleName, value) {
        options.rules[ruleName] = value;
        if (options.message) {
            options.messages[ruleName] = options.message;
        }
    }

    $jQval.addMethod("mustbetrue", function (value, element, param) {
        // check if dependency is met
        if (!this.depend(param, element))
            return "dependency-mismatch";
        return element.checked;
    });

    $.validator.unobtrusive.adapters.add("mustbetrue", function (options) {
        setValidationValues(options, "mustbetrue", true);
    });

    $jQval.unobtrusive.parse();
</script>
person counsellorben    schedule 04.08.2011
comment
Спасибо за это еще раз! Это странно, хотя я точно понимаю, что вы говорите, и понимаю, что это должно работать, как только я беру «addMethod» и «add» из jquery.validate.unobtrusive.js и помещаю любую из вышеперечисленных комбинаций в другой js файл перестает работать! Я даже поместил console.log в метод addBool в файле jquery.validate.unobtrusive.js, чтобы проверить, что mustbetrue регистрируется, и это так! Как я уже сказал Странно! - person Sniffer; 04.08.2011
comment
Я думаю, очень важно сказать, что вам нужно это в вашей разметке, чтобы приведенное выше решение работало: ‹input mustbetrue=true type=textbox /› - person Kenneth Jakobsen; 26.03.2013
comment
Вы можете упростить добавление своего ненавязчивого адаптера: $.validator.unobtrusive.adapters.addBool(mustbetrue); Вам также не нужно вызывать синтаксический анализ, пока вы добавляете новый метод проверки и адаптер вне готового документа. - person Erik W; 05.09.2013

Ненавязчивая валидация не дает мне ничего, кроме горя.

На очень простой тестовой странице это работает:

$(document).ready(function () {
    jQuery.validator.unobtrusive.adapters.add(
        'mustbetrue', ['properties'], function (options) {
            options.rules['mustbetrue'] = options.params;
            options.messages['mustbetrue'] = options.message;
        }
        );

    jQuery.validator.addMethod('mustbetrue', function (value, element, params) {
        // check if dependency is met
        if (!this.depend(param, element)) {
            return "dependency-mismatch";
        }

        switch (element.type) {
            case "checkbox":
                return element.checked;
                break;
            case "hidden":
                return (value == 'true' || value == 'True');
                break;
            default:
                alert('type = ' + element.type);
                return true;
                break;
        }
    });
});

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

Решение советника работает в моей более сложной форме.

Если кто-нибудь может указать мне сайт, который подробно объясняет, как правильно добавить собственный валидатор для ненавязчивой проверки, я буду бесконечно благодарен. Каждый сайт, который я посещаю, имеет другое решение.

person YeeHaw1234    schedule 26.06.2013
comment
Этот код НЕ должен быть в функции готовности документа. Ненавязчивая проверка выполняется для готового документа, и ожидается, что к этому времени будут добавлены все добавленные правила. - person Erik W; 05.09.2013
comment
@ErikW да, я боролся с этим около часа, и теперь я могу подтвердить, что этот код НЕ должен быть в функции готовности документа - он просто не будет работать. - person Michał Powaga; 26.10.2013

У меня нет проблем с добавлением этого кода во внешний файл javascript, который я украл из Этот сайт

// Custom validator for checkboxs
jQuery.validator.unobtrusive.adapters.add("brequired", function (options) {    
    //bool-required for checkboxes    
    if (options.element.tagName.toUpperCase() == "INPUT" && 
        options.element.type.toUpperCase() == "CHECKBOX") 
    {
        options.rules["required"] = true;        
        if (options.message) {
            options.messages["required"] = options.message;
        }
    }
});

Вы уверены, что разместили свой скрипт ПОСЛЕ скриптов jquery на своей странице? Мой последний в списке.

person Erik Funkenbusch    schedule 27.08.2011