1

検証と目立たないjqueryを使用して、ASP MVC3プロジェクトに取り組んでいます。カスタム検証を作成する必要があるページにいくつかの領域があり、それが他のものを壊さないようにします。現在、いくつかのセクションがあり、それぞれにラジオ ボタン ペア、いくつかのテキスト ボックス、ボタン、およびテーブルがあります。ユーザーがテキスト ボックスに入力し、ボタンを押すと、テキスト ボックスのデータをテーブルの新しい行に入れる関数があります。ボタンを押すたびに1回進むカウンターもあります。

検証は、「ラジオ ボタンが true を返した場合、カウンターは > 1 である必要があります。

動作するように見えるこの関数を書きましたが、既存の検証に結び付けられるように書き直す必要があると考えているため、メソッドまたはルールを追加する必要があります。

$(document).ready(function () {
    $("#nextBtn").click(function () {
         var rows = $("#ROTable tr").length;
          if ($("#RO_Yes").is("checked") && (rows < 3))
          {
             $(this).closest("div.historyCollection").css("backgroundcolor: #ff0000;");
          }
    });
});

いろいろ調べてみたところ、JQUEry サイトでルール (従属値) について説明しているセクションが見つかりました。しかし、私はこのことにかなり慣れていないので、一方向に固執する前に専門家に意見を求めたいと思いました. 読んでくれてありがとう。

編集:私は遊んでいて、これを思いつきました:

2 番目の編集: TallMaris が指摘したように、ROCounter セレクターが間違っていたため、現在は修正されていますが、同じエラーで失敗します。

$(document).ready(function () {
    $("#ROCounter").rules("add", {
        required: ($("#RO-Yes").is(":checked")) && ($('#ROCounter') < 1),
        messages: {
            required: "Please enter further information"
        }
    });
});

しかし、それはすべての検証を壊し、jquery.validate.min.js ファイルでエラーを引き起こしました: "TypeError: 未定義のプロパティ 'form' を読み取れません"。

ROCounter は隠しフィールドです。エラーメッセージがこの非表示フィールドに添付されている場合、メッセージも非表示になるので表示されないということですか? ここにいくつかの HTML があります:

<div class="formQuestion">
        <div class="editor-field2">
            @Html.RadioButtonFor(m => m.HistoryModel.EverHadRestrainingOrder, true, new { @class = "commentBox", id="RO_Yes" })
                <label for="HistoryModel_ChildAbuseCurrent">Yes</label>
            @Html.RadioButtonFor(m => m.HistoryModel.EverHadRestrainingOrder, false, new { @class = "commentBox", id = "RO_No", @checked = "checked" })
                <label for="HistoryModel_ChildAbuseCurrent">No</label>
        </div>
        <div class="editor-label2">
            @Html.LabelFor(m => m.HistoryModel.EverHadRestrainingOrder)
        </div>

@*  Start Fieldset collection for Restraining Order   *@
   <div class="hidden">
     <fieldset class="historyCollection"> 
       <legend>Please provide the following information</legend>  
        <div class="formGroupHist">
            <div class="editor-label-Hist">
                @Html.Label("Date of Order")
            </div>
            <div class="editor-field-Hist">
                @Html.TextBox("OrderDate-RO", null, new { @class = "dp" })
            </div>
        </div>

        <div class="formGroupHist" style="width: 125px">
            <div class="editor-label-Hist">
                @Html.Label("State")
            </div>
            <div class="editor-field-Hist">
            @Html.DropDownList("State-RO", new SelectList(Model.State, "Value", "Text"), "Select", new { style = "width: 65px;" })
            </div>
        </div>

        <div class="formGroupHist">
            <div class="editor-label-Hist">
                @Html.Label("Name of Protected Party")
            </div>
            <div class="editor-field-Hist">
                @Html.TextBox("ProtectedParties")
            </div>
        </div>            

        <div class="formGroupHist">
            <div class="editor-label-Hist">
                @Html.Label("Explanation of Circumstances")
            </div>
            <div class="editor-field-Hist">
                @Html.TextArea("Comments-RO")
            </div>
        </div>
        <div class="button">
            <button type="button" id="ROButton" class="SKButton">Add Information</button>
        </div>

        <div>
            @Html.HiddenFor(m => m.ROCounter)
        </div>
        <table id="ROTable" class="data-table-page2">
            <tr>
                <th>Date of Order</th>
                <th>State</th>
                <th>Name(s) of Protected Parties</th>
                <th>Explanation of Circumstances</th>
            </tr>
            <tr class="ROTempRow">
                <td colspan=4>No Information Entered.</td>

            </tr>
        </table>
    </fieldset>
</div>

ただし、私の主な質問は、新しい検証ルールを既存の検証に正しく結び付ける方法です。unobtrusive は最初に既存の検証を探してドキュメントを解析し、見つかった場合はそれ以上進めないことを読みました。フォームの大部分は「在庫」検証に関連付けられているため、破損することはありません。その部分が分かれば、実際のルール コーディングもわかると思います。

ありがとうございました。

4

1 に答える 1

2

コメントに記載されているように、MVCからの在庫検証により、「必須」ルールはすでに適用されています。さらに、MVC3には最小値のストックバリデーターがないようですが、範囲のみです...バリデーターオブジェクトに独自のメソッドを追加し、このルールを次のようにオブジェクトに追加することをお勧めします(APIドキュメントから)

$.validator.addMethod("min_counter", function (value, el) {
    return value > 1;
});

次に、ルールを追加します。上記のメソッドの名前がルールオブジェクトとメッセージオブジェクトのキーとして繰り返されていることに注意してください。これは、validate()メソッドが実際の検証を実行するために実行するメソッドを認識する方法です。

$("#ROCounter").rules("add", {
    //this tells validator to evaluate only when the radio is checked. 
    //For example, if you put "true" here, the rule "min_counter" will be evaluated always.
    min_counter: $("#RO-Yes").is(":checked"), 
    messages: {
        min_counter: "Please enter further information"
    }
});

それがあなたのために働くかどうか私に知らせてください。

于 2012-10-19T23:18:20.710 に答える