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);
});

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

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

S

Ответ 1

Наркоман,

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

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

<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. Добавление пользовательского метода выглядит следующим образом:

<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>

Ответ 2

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

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

$(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;
        }
    });
});

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

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

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

Ответ 3

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

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