クライアント検証
ページにクライアント認証が有効になっている場合、往復中に完全に異なる一連のイベントが発生します。クライアント認証は、クライアントJScript®を使用して実装されています。この検証を実装するためにバイナリコンポーネントは必要ありません。
JScript言語は十分に標準化されていますが、ブラウザ内のHTMLドキュメントと対話するために使用されるドキュメントオブジェクトモデル(DOM)には広く採用された標準はありません。したがって、クライアント認証は、認証オブジェクトがインターネットエクスプローラーDOMであるため、Internet Explorer 4.0以降でのみ実行されます。
サーバーの観点から、クライアントの検証は、検証制御が異なるコンテンツをHTMLに送信することのみを意味します。それ以外は、そのイベントシーケンスはまったく同じです。サーバー側のチェックはまだ実行されています。冗長に見えるかもしれませんが、それは非常に重要です。
一部の検証コントロールは、クライアントスクリプトをサポートしていない場合があります。良い例があります。CustomValidatorとサーバーの検証関数の両方を使用する場合は、クライアント検証関数はありません。
安全上の注意。一部の人々は、スクリプトを含むページを簡単に取得してから、そのページを無効または変更できます。悪いデータがシステムに入るのを防ぐためにスクリプトを使用するのではなく、ユーザーからより速いフィードバックを取得するためだけです。したがって、CustomValidatorを使用する場合は、対応するサーバー検証関数なしでクライアント検証機能を提供しないでください。
各確認制御により、標準のクライアントスクリプトブロックがページに送信されるようになります。実際、これは、スクリプトライブラリWebUivalidation.jsのコードへの参照を含むコードのほんの一部です。このスクリプトライブラリファイルには、クライアント検証用のすべてのロジックが含まれています。
スクリプトライブラリについて
確認Webコントロールスクリプトはスクリプトライブラリにあるため、すべてのクライアントが検証したコードを直接ページに送信する必要はありませんが、表面上でそうしているようです。メインスクリプトファイルの参照は次のようになります:
<スクリプト言語= "javascript"
src = "/_ aspx/1.0.9999/script/webuivalidation.js"> </scrip>
デフォルトでは、スクリプトファイルは「_aspx」ディレクトリのデフォルトのルートディレクトリにインストールされ、root関連のスクリプトには、フォワードスラッシュから始まるルート相対的なスクリプトが含まれます。この参照は、個々のオブジェクトがスクリプトライブラリを含める必要がなく、同じコンピューター上のすべてのページが同じファイルを参照できることを示しています。このパスには、同じコンピューターで異なるランタイムバージョンが実行できるように、このパスには共通のランタイムバージョン番号もあることに気付くでしょう。
デフォルトの仮想ルートディレクトリを見ると、ファイルを見つけてその内容を表示します。これらのファイルの場所は、config.webファイルで指定されています。 config.webファイルは、ほとんどのASP+設定のXMLファイルです。以下は、ファイル内の場所の定義です。
<webControls
clientscriptslocation = "/_ aspx/{0}/script/"
/>
何が起こったのかについての洞察を得るために、スクリプトを読むことをお勧めします。ただし、これらのスクリプトの機能は特定のランタイムバージョンに密接にリンクされているため、これらのスクリプトを変更しないことをお勧めします。ランタイムバージョンが更新されると、これらのスクリプトには対応する更新が必要になる場合があり、変更を放棄するか、スクリプトが機能しない問題に直面します。特定のプロジェクトがこれらのスクリプトを変更する必要がある場合は、最初にスクリプトをバックアップしてから、これらのファイルの場所をプライベートconfig.webファイルに置き換えて、プロジェクトをバックアップファイルに向けます。文字列にフォーマット命令「{0}」が含まれている場合、ランタイムバージョン番号は命令を置き換えます。その場所を相対的または絶対的な参照に変更するのが最善です。
クライアント認証を無効にします
クライアント認証が必要ない場合があります。入力フィールドの数が小さい場合、クライアントの検証はほとんど役に立たない場合があります。結局のところ、毎回サーバーに出入りする必要があるロジックが必要です。クライアントに動的に表示される情報は、レイアウトにマイナスの影響を与えることがわかります。
クライアント認証を無効にするには、ページディレクティブ「ClientTarget = downLevel」を使用します。この指令は、次のASPXファイルの先頭に似ています。
<%@ページ言語= "c#" clientTarget = downLevel%>
この指令のデフォルト値は「Auto」です。つまり、Microsoft Internet Explorer 4.0以降のクライアント認証のみを実行します。
注:残念ながら、ベータ1では、この指令は検証を単純に無効にするのではなく、HTML 3.2タグを使用してすべてのWebコントロールを処理するため、予期しない結果が生成されます。最終バージョンは、この問題を制御するためのより良い方法を提供します。
クライアントイベントシーケンス
このシーケンスは、クライアントの検証を含むページを実行するときに発生する一連のイベントです。
ページがブラウザにロードされると、各検証制御はいつか初期化する必要があります。これらのコントロールは<Span>タグとして送信され、HTML属性はサーバー上の属性に最も近いものです。最も重要なことは、検証装置が参照するすべての入力要素は、現時点で「取り付けられている」ことです。参照される入力要素は、入力が変更されるたびに検証ルーチンが呼び出されるようにクライアントイベントを変更します。
スクリプトライブラリのコードは、ユーザーがTABキーを使用してフィールドを切り替えると実行されます。個別のフィールドが変更されると、検証条件が再評価され、必要に応じてバリデーターが表示されるか、見えないようになります。
ユーザーがフォームを送信しようとすると、すべてのバリデーターが再評価されます。これらのすべてのバリデーターが有効な場合、フォームはサーバーに送信されます。 1つ以上のエラーがある場合、次の状況が発生します。
提出はキャンセルされました。フォームはサーバーに送信されません。
すべての無効なバリデーターが表示されます。
検証概要にshosummary = trueが含まれている場合、検証制御からのすべてのエラーが収集され、それらの内容がそれらのエラーで更新されます。
検証の要約にshowmessagebox = trueが含まれている場合、エラーが収集され、クライアントの情報ボックスに表示されます。
クライアント検証コントロールは、変更が入力または提出されるたびに実行されるため、これらの検証コントロールは通常、クライアントで2回以上評価されます。提出後、これらの検証制御はサーバー上で再評価されることに注意してください。
クライアントAPI
クライアントマシンで使用して、独自のクライアントコードでさまざまな効果を達成できる小さなAPIがあります。一部のルーチンを非表示にすることはできないため、理論的には、クライアントを活用して、スクリプトで定義されたすべての変数、機能、および関数を確認できます。ただし、これらの多くは、変更できる実装の詳細です。以下は、使用することをお勧めするクライアントオブジェクトをまとめたものです。
表3。クライアントオブジェクト
名前タイプの説明
page_isvalidブール変数は、ページが現在有効かどうかを示します。検証スクリプトは、常に変数を最新の状態に保ちます。
Page_Validators Element Arrayこれは、ページ上のすべてのバリデーターを含む配列です。
page_validationactiveブール変数は、検証を実行する必要があるかどうかを示します。この変数をfalseに設定することは、プログラミングによってオフにすることができます。
ISVALID BOOLEANプロパティ各クライアントバリーターには、このプロパティには、検証装置が現在有効かどうかを示しています。 PDCバージョンでは、このプロパティは上限と小文字( "isvalid")と混合されていることに注意してください。
クライアント認証をバイパスします
しばしば実行する必要があるタスクの1つは、ページにキャンセルボタンまたはナビゲーションボタンを追加することです。この場合、ページにエラーがある場合でも、ボタンを使用してページを送信することをお勧めします。クライアントボタン「OnClick」イベントは、フォームの「OnSubmit」イベントの前に発生するため、チェックの送信と検証のバイパスを避ける場合があります。以下では、HTML画像コントロールをキャンセルボタンとして使用してタスクを完了する方法について説明します。
<入力型=画像runat = server
value = "キャンセル"
onserverclick = cmdcancel_click>
「オンクリック」イベントは同じ名前のサーバー側イベントであると想定されるため、ボタンまたはImageButtonコントロールを使用してこのタスクを実行すると、混乱が生じます。クライアントスクリプトでイベントを設定する必要があります。
<ASP:ImageButton runat = server id = cmdimgcancel
AlternateText = "キャンセル"
onclick = cmdcancel_click/>
<スクリプト言語= "javascript">
document.all ["cmdimgcancel"]。onclick =
新しい関数( "page_validationactive = false;");
</script>
この問題を解決する別の方法は、キャンセルボタンを設定して、クライアントスクリプトが返されたときにコミットイベントをトリガーしないようにすることです。 HTMLinputButtonとLinkButtonコントロールは、この例です。
特撮
もう1つの一般的な要件は、エラーが発生した場合、バリデーター自体によって表示されるエラーメッセージに加えて、必要な他の効果があることです。この場合、あなたが行った変更は、サーバーまたはクライアントで同時に行う必要があります。入力が有効かどうかに応じて、色を変更するためにラベルを追加する必要があるとします。サーバーにこのタスクを実装する方法は次のとおりです。
パブリッククラスChangeColorpage:ページ{
パブリックラベルlblzip;
public RegularexpressionValidator valzip;
保護されたオーバーライドボイドオンロード(eventargs e){
lblzip.forecolor = valzip.isvalid.black:color.red;
}
}
上記の方法はすべて完璧ですが、上記のように検証を変更する限り、クライアントで同じことをしない限り、非常に矛盾していることがわかります。検証フレームワークは、これらのデュアル効果の多くから妨げられますが、クライアントとサーバーの両方で同時に達成する必要がある他の効果を回避することはできません。クライアントで同じタスクを実行するスニペットが次のとおりです。
<ASP:ラベルID = lblzip runat = server
text = "zip Code:"/>
<asp:textbox id = txtzip runat = server
/> </asp:textbox> <br>
<ASP:RegularexpressionValidator ID = valzip runat = server
controltovalidate = txtzip
errormessage = "無効な郵便番号"
validationExpression = "[0-9] {5}" /> <br>
<スクリプト言語= javascript>
関数txtziponchange(){
//クライアント認証がアクティブでない場合、アクションは実行されません
if(typeof(page_validators)== "未定義")return;
//ラベルの色を変更します
lblzip.style.color = valzip.isvalid: "red";
}
</script>
ベータ1クライアントAPI
ベータバージョン1の場合、クライアントスクリプトから呼び出すことができるいくつかの関数は、他の状況を引き起こす可能性があります。
表4。クライアントスクリプトから呼び出された関数
名前の説明
ValidatorValidate(VAL)は、クライアントバリデーターを入力として受け取ります。 Validatorに入力を確認し、ディスプレイを更新します。
validatorEnable(val、enable)クライアントバリエーターとブール値を取得します。クライアントバリーターを有効または無効にします。無効にした場合、クライアントバリエーターは評価されず、クライアントバリエーターは常に有効なものとして表示されます。
validatorhookupcontrol(control、val)は、入力HTML要素とクライアントバリエーターを取得します。その要素の変更イベントを変更または作成して、バリデーターが変更されたときに更新されるようにします。この関数は、複数の入力値に基づいたカスタムバリデーターに適しています。
その特別な目的は、バリデーターを有効または無効にすることです。確認を特定の状況でのみ効果的にしたい場合は、サーバーとクライアントの両方のアクティベーションステータスを変更する必要がある場合があります。そうしないと、ユーザーがページを送信できないことがわかります。
以下は、上記の例に加えて、チェックボックスがチェックされていない場合にのみ検証されたフィールドです。
パブリッククラスの条件:ページ{
public htmlinputcheckbox chksameas;
public rebusefieldvalidator rfvalshipAddress;
保護されたオーバーライドvoid validate(){
bool enableship =!chksameas.checked;
rfvalshipaddress.enabled = enableShip;
base.validate();
}
}
これがクライアントの等価コードです:
<入力タイプ=チェックボックスrunat = server id = chksameas
>支払いアドレスと同じ<br>
<スクリプト言語= javascript>
function onchangesameas(){
var enableShip =!event.srcelement.status;
validatorEnable(rfvalshipAddress、enableShip);
}
</script>