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.

P.P.S. Намерих отговора за добавяне на персонализирани методи за валидиране. За да добавите персонализирани mmethods за валидиране, без да модифицирате 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 файл спира да работи! Дори сложих consol.log в метода ath 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;
        }
    });
});

Въпреки това, когато преместя този код в моята по-сложна форма, внезапно той спира да работи и нямам представа защо и нямам време да се ровя в ненатрапчивия код, за да се опитам да разбера.

Решението на counsellorben работи в моята по-сложна форма.

Ако някой може да ме насочи към сайт, който обяснява подробно как правилно да добавя персонализиран валидатор към ненатрапчиво валидиране, ще бъда винаги благодарен. Всеки сайт, който посещавам, има различно решение.

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