2

時間フィールド (「09:00」、「15:35」など) で独自のアプリケーションのロジックを処理する CustomValidator を構築していますが、オンラインで説明が見つからない動作につまずいています。

現在私が注目しているのは、クライアント側で実行される検証ロジックです。

タイトルで述べたように、問題は、Validator で ControlToValidate プロパティを検証中のテキストボックスの ID に設定した場合にのみ、フォーカスがテキストボックスを離れるとすぐに検証が開始されることです。onblur イベントの前にも発生しますが、これは私にとって絶対に有害です。これは、onblur イベントを使用して時間形式を標準化しているためです (例: "9:00" -> "09:00"、"11.45" -> "11: 45") であるため、検証ロジックが誤った値を受け取る可能性があります。一方、ControlToValidate プロパティが空白のままの場合、ClientValidationFunction は送信/ポストバックでのみ起動されます。

私が見つけた唯一の関連する答えはこれhttps://stackoverflow.com/a/8649697/450684ですが、それでも私にはまったく意味がありません。ControlToValidate の存在が、onblur の前にクライアント側の検証を実行する必要があることを示す必要があるのはなぜですか? いらない!この動作を抑制する方法はありますか?

以下はページの例です。

<asp:TextBox runat="server" AutoPostBack="false" ID="txtBox1" onblur="FormatText(this);" />
<asp:CustomValidator runat="server" ID="CV1" ControlToValidate="txtBox1" ClientValidationFunction="Test1" />
<asp:CustomValidator runat="server" ID="CV2" ClientValidationFunction="Test2" />
<asp:Button ID="btn1" Text="postback" runat="server" OnClick="btn1_Click" />
<asp:Label ID="lbl1" runat="server" />
<script type="text/javascript">
    function FormatText(txtBox1)
    {
        alert('FormatText');
    }
    function Test1(val, args)
    {
        alert('Test1');

    }
    function Test2(val, args)
    {
        alert('Test2');
    }</script>

私が望むのは、Test1 と Test2 の両方が btn1 のクリックでのみ実行されることです。代わりに、txtBox1 の onblur イベントで、Test1 と FormatText をこの順序で実行します。

ASP.NET のクライアント検証は、書いたり勉強したりするのがとても楽しかったです。これですべてが台無しにならないようにしてください :-)

どうも

PS: .NET フレームワークのバージョンは 4.0 です。さらに、サーバー側の言語は C# です。

4

2 に答える 2

2

何が起こっているかは次のとおりだと思います。

ASP.NET クライアント側検証の標準的な動作は、フィールドが終了したときに検証することです。これは所見であり、公開された標準への参照ではありません (あるかもしれませんが)。すぐに使用できるバリデーターはすべてこのように動作します。それらはすべて、検証する特定のフィールドを指定する必要があります。

カスタム バリデーターを使用すると、単一のコントロールを (ControlToValidate で指定して) 検証したり、コントロールの組み合わせを検証したりできます。この場合、ControlToValidate を空の文字列に設定します。変更がない限り、指定する必要があります。この属性を省略すると、検証は行われません。

したがって、検証するコントロールを指定すると、カスタム バリデータは他のすべてのバリデータと同じように動作し、ユーザーがフィールドを終了すると反応します。検証するコントロールを指定しないと、関心のあるコントロールが認識されず、それが行われません。

真のカスタム バリデータを作成することで、これを回避できる場合があります: BaseValidator から継承します。それは実際にはとても楽しいことです。

于 2012-11-30T23:01:21.100 に答える
1

コントロールの検証イベントを管理する方法。バリデーターから ControlToValidate プロパティを削除し、必要に応じて textbox イベントでテキストボックスの検証をバインドできます。検証の前または後に、いくつかの関数ロジックを追加することもできます。ボタン クリック イベントの検証は、変更なしで同じままです。

function BindValidation(){$('#txtBox1').on('blur keyup change',function(){ValidatorValidate($('#CV1').get(0));});}
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(BindValidation);


//validation function  example for CV1 validator
function Test1(val, args)
{                  

    args.IsValid=$('#txtBox1').val().length>0&&$('#txtBox1').val().match(/^\s+$/g)==null;
}
于 2012-12-01T11:39:41.300 に答える