1

私が見つけた他のすべてのjQuery検証の質問を読みましたが、何も役に立ちません。私はとてもシンプルなはずの何かをしようとしていますが、目立たない検証により、4台のモニターすべてに穴を開けたいと思っています(嫉妬?)

の形式のフィールドとselect、日付ピッカーとしてのフィールドがあります。selectが特定の値をとると、日付が必須になります。他のすべての選択値の場合、日付はオプションです。ページが最初に読み込まれるとき、日付はオプションですRequired。つまり、モデルのメタデータに属性はありません。

これが私のスクリプトブロックと私が助けを必要としているもののための穴です:

<script type="text/javascript">
    function DateRequirement() {
        if ($("#StatusID").val() == 602) {
            $("#DateOfFirstCoverage").attr("data-val-required", "A date is required for current members.");
            // some kind of re-validating here?
        }
        else if ($("#DateOfFirstCoverage").attr("data-val-required") !== undefined) {
            $("#DateOfFirstCoverage").rules("remove", "required");
            // some kind of re-validating here?
        }
    }

    $("#StatusID").change(DateRequirement);
    $(document).ready(DateRequirement);
</script>

参考までに、使用など、要件を追加する他の方法を試しましたが、.rules("add", { required: true })まだ問題があります。これが私の問題のリストです:

  1. 必要な追加方法で、.rules設定が未定義のエラーが発生します。多くのSOの回答は、最初にフォームを再検証する必要があることを示しています。これは、エラーを取り除きますが、フィールドが必須にならないことを除いて、私が試しました。
  2. 上に示したコードの現在の方法では、フィールドが必須になりますが、ドキュメントの準備中に設定されている場合に限ります。ロード後に選択ボックスを変更しても、必須になることはありません。
  3. すべての中で最も奇妙な問題は、私が何をしようとも、成功のヒントを与えるものはすべて、ページの残りの検証を台無しにします。他にもたくさんの必須フィールドがあります。自分のDateOfFirstCoverageフィールドが正常に必須になり、入力したが別の必須フィールドを削除した場合、ページは他のフィールドについて不満を言うことなく、問題なく送信されます。これは、たとえば、スニペットの一部が次のようになっている場合に発生します。

    if ($("#StatusID").val() == 602) {
        $("form").validate();
        $("#DateOfFirstCoverage").rules("add", { required: true });
    }
    

それで、一体何が起こっているのですか?残りのルールをいじることなく、私が望むことを達成するための「正しい」方法は何ですか?

4

1 に答える 1

5

これを考え出した。正解は他の投稿の 1つ (この投稿) で入手できましたが、その使用方法を理解する必要がありました。最後のスクリプト ブロックは次のとおりです。

<script type="text/javascript">
    function DateRequirement() {
        $("form").removeData("validator").removeData("unobtrusiveValidation");
        $.validator.unobtrusive.parse("form");

        if ($("#StatusID").val() == 602) {
            $("#DateOfFirstCoverage").rules("add", { required: true, messages: { required: "A date is required for current members." } });
        }
        else {
            $("#DateOfFirstCoverage").rules("remove", "required");
            $("form").validate().element("#DateOfFirstCoverage");
            console.log("reset");
        }
    }

    $("#StatusID").change(DateRequirement);
    $(document).ready(DateRequirement);
</script>

上部のバリデーターを削除すると、バリデーターが既に接続されているため、目立たない検証が早期に失敗することがなくなります。これにより、他のフィールドが検証されなかった理由に関する私の奇妙な問題が解決されました。次に、控えめに解析を依頼することで、常にバリデーターが存在するため、必要なルールに対して通常のルールの add メソッドを使用できます。

于 2012-10-22T20:02:54.013 に答える