MVC Добавление методов в jquery.validate.unobtrusive.js - PullRequest
10 голосов
/ 04 августа 2011

Недавно у меня возник вопрос о получении проверки флажка на стороне клиента в рамках проекта 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

Ответы [ 3 ]

10 голосов
/ 04 августа 2011

Sniffer,

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

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

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

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

counsellorben

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

P.P.S. Я нашел ответ для добавления пользовательских методов проверки. Чтобы добавить пользовательские методы проверки без изменения 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>
3 голосов
/ 26 июня 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;
        }
    });
});

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

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

1 голос
/ 28 августа 2011

У меня нет проблем с добавлением этого кода во внешний файл 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 на своей странице? Моя последняя в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...