2011-06-22 7 views
2

Webフォームには、さまざまなasp.net検証コントロールがあります。有効な特定の検証コントロールをチェックすることは可能ですか?たとえば、textboxのフォーカスを離れると、requiredFieldValidatorUserNameが有効であることを確認します。有効な場合は、このユーザー名が既に予約されていないことをajaxを使用してサーバー上でチェックします。特定のasp.net検証コントロールをチェックする方法は有効ですか?

編集:

、について説明:私は、クライアント側の検証コントロールの(つまり、入力が有効であった)の有効性をチェックしたいです。

ご案内しています。

+0

どちらの要件に対してもサーバー側の検証を実行しない理由は、検証コントロールの検証を行うことができるかどうかはわかりません。 –

+1

投稿する前に確認したい場合は、そのクライアント側で行う必要があります。必要なフィールドバリデーターのようなものは、EnableClientScript = "true"に設定する必要があります。テキストボックスを終了した直後に検証する必要があります。 – Peter

+0

@ムハンマドアワーズ、私はアヤックスの仕事をしたいと言いました:) 私はサーバーに行くべきだと感じますか/ – user576510

答えて

3

CustomValidatorをクライアントサイドコードに使用すると、すべてのエラーメッセージが表示され、フォームの送信をブロックし、サーバー側で検証が繰り返されるようになることをお勧めします。クライアント-sideバリデーションが利用可能であることは、ユーザがそれを見たことを意味しません。サーバでの入力を常に確認してください。

あなたCustomValidatorはその後、Ajaxのメソッドを呼び出すようにコード化されるだろう、とクライアントに正しくエラーメッセージが表示されるでしょう:

<asp:Label ID="UserNameLabel" AssociatedControlID="UserName" runat="server"> 
    UserName *:</asp:Label> 
<asp:TextBox ID="UserName" runat="server" /> 
<asp:RequiredFieldValidator ID="UserNameRequired" runat="server" 
          ControlToValidate="UserName" EnableClientScript="true" 
          ErrorMessage="You must supply a username!" /> 
<asp:CustomValidator ID="UserNameCustom" runat="server" 
        ControlToValidate="UserName" 
        ClientValidationFunction="CheckExisting" 
        OnServerValidate="UserNameCustomValidate" 
        ErrorMessage="Username already taken" /> 

そして、あなたのClientValidationFunctionは、次のようになります。(

<script type="text/javascript"> 
    function CheckExisting(source, arguments) { 
    // Pass the arguments.Value to your AJAX call: 
    if (ajaxCallUserNameTaken(arguments.Value)) { 
     arguments.IsValid = false; 
    } 
    } 
</script> 

明らかに、ページメソッド/ Webサービス/ etcを呼び出すには、ajaxCallUserNameTakenメソッドを記述する必要があります。

検証方法が期待どおりに行われることを確実にします。これは、ユーザがテキストボックスからタブアウトするたびに呼び出され、値が(テキストボックスが空の場合は呼び出されません)となり、ユーザが一意の値を提供するまでページを送信できなくなります。また、OnServerValidateで参照されているメソッドを作成して、サーバーにヒットした後でも値が有効であることを確認する必要があります。コードの重複を減らすためにAJAXエンドポイントが使用するコードと同じコードを呼び出す必要があります。

私はもともとあなたがonBlurイベントでいくつかのチェックを行うには、クライアント側でPage_Validatorsオブジェクトを使用することができることを示唆するつもりだったが、私は本当にそれがより疼痛をもたらすとして、これはここに適しているとは思わない:

  1. それは、ページ上に複数のバリデータがあるかもしれませんが、私たちは制御のうち、ユーザが移動した場合のRequiredFieldValidatorはOnBlur中に発射されていない
  2. をチェックしているコントロール上の唯一のRequiredFieldValidatorがあることを前提としてい値を設定せずに - 値を設定してクリアする場合にのみ、isvalidtrue、空の文字列をチェックする必要があります。
4

すべてのバリデータコントロールは、IsValidプロパティを含むIValidatorを実装しています。

myValidatorControl.IsValid 
+0

それはクライアント側ですか?私はそれがサーバー側にあることです。 – user576510

+0

申し訳ありませんが、私はそのreqを逃したか、それは遅れて追加されました。 –

1

私はちょうど同じ問題に直面していると私は、テキストボックスコントロールにCausesValidation="true"を設定し、それが働きました。試してみてください:)

1

これは、他と区別して扱いたいValidatorコントロールのValidationGroupを設定することで可能です。検証しているコントロールのValidationGroup(ユーザー名フィールド)と一致することを確認してください。

+0

私はコントロールを別に扱いたくないのですが、入力が有効かどうかを確認したいのですか?私は入力にajax作業をdpingされます。 – user576510

+0

はい、一度に(AJAXやその他の方法で)とは対照的に、ページ上の他のものに_separately_チェックしたいと思うようです。 – Widor

0

私はこれをちょっとやっていて、jQueryを使ってこれを処理するのは簡単ではない(効率的ではない)ソリューションを見つけました。あなたのバリデータにDisplay="Dynamic"を使用している場合、この関数は非常に似ている

function validateControl() { 
    return $('#YOUR_VALIDATOR_ID').css("visibility") == "visible" 

function validateControl() { 
    return return $('#YOUR_VALIDATOR_ID').css("display") == "inline" 

は必ずチェックしてください

この機能を使用して、あなたのコントロールの有効性を確認しますMasterpageを使用している場合は、IDEのIDとは異なるため、バリデータの真のIDです。ブラウザでページソースを表示してください。

JavaScriptや独自のコードを記述できるCustomValidatorを使用して、フォームを他の方法で検証するのが最適なソリューションです。

関連する問題