12

最近、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

4

3 に答える 3

11

スニッファー、

見れば見るほど頭が(自分に)振ります。

さらに検討すると、ページ スクリプトに次の 1 行を追加すれば、Darin の方法は機能します。

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

変更 (新しいアダプターの追加など) を行うたびに、目立たない検証属性を再解析する必要があります。の最後のアクションjquery.validate.unobtrusive.jsは属性の解析であり、解析後にアダプタが追加されるため、再解析によってこの問題が解決されます。

カウンセラーベン

jquery.validate.jsPSこれで問題は解決しますが、組み込みメソッドを使用しない他のカスタムバリデーターを変更せずに追加する方法の問題は未解決のままjquery.validate.unobtrusive.jsです。

PPS カスタム検証メソッドを追加するための答えが見つかりました。を変更せずにカスタム検証メソッドを追加する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>
于 2011-08-04T14:00:24.663 に答える
3

目立たない検証は、私に悲しみしか与えていません。

非常に単純なテスト ページでは、次のように動作します。

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

しかし、このコードをより複雑な形式に移動すると、突然機能しなくなり、理由がわからず、目立たないコードを調べて調べる時間もありません。

カウンセラーベンの解決策は、私のより複雑な形で機能します。

カスタムバリデーターを目立たない検証に適切に追加する方法を詳細に説明しているサイトを誰かが教えてくれれば、私は永遠に素晴らしい. 私が訪問する各サイトには、異なる解決策があります。

于 2013-06-26T13:34:06.613 に答える
1

このコードをこのサイトから盗んだ外部の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 スクリプトの後にスクリプトを配置したことは確かですか? 私のはリストの最後です。

于 2011-08-27T23:49:42.827 に答える