1. イベント
これは私が長い間無視してきたか、発見できなかった問題です。問題は次のとおりです。
ページに検証コントロールがあり、Button コントロールが OnClientClick イベントをトリガーし、このイベントが true と false を返すと、検証コントロールは無効になり、機能しなくなります。具体的な説明は以下の通りです。
.Net ページは次のとおりです。
次のようにコードをコピーします。
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:スクリプトマネージャー>
<div>
<asp:TextBox ID="TextBoxTest" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBoxTest"
ErrorMessage="空にすることはできません" Display="None"></asp:RequiredFieldValidator><ajaxToolkit:ValidatorCalloutExtender
ID="ValidatorCalloutExtender1" TargetControlID="RequiredFieldValidator1" runat="server">
</ajaxToolkit:ValidatorCalloutExtender>
<asp:Button ID="ButtonText" runat="server" Text="Test" OnClientClick="returnconfirm('送信してもよろしいですか?');"
</div>
</form>
上記と同様に、TextBoxTest の値が空にならないように、ページに RequireFieldValidator 検証コントロールを追加します。ButtonText がページを送信するときに、送信する必要があるかどうかをユーザーに確認するように求められます。非常にシンプルなページなので問題はないようです。ただし、TextBoxTest の値が空の場合、検証コントロールは機能せず、ページは正常に送信されます。その理由は何でしょうか?
2. イベントに応答する
どうしたの?まず、ButtonTest の OnClientClick イベントを削除した後、検証コントロールが機能しました。これはなぜでしょうか?ページのソース コードを確認したところ、ButtonTest コントロールが次のソース コードを生成していることがわかりました。
<input type="submit" name="ButtonText" value="Test" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(ButtonText, , true, , , false, false))" id="ButtonText" />
このソース コード行からわかるように、検証コントロールはクライアント側で JavaScript コードを生成し、TextBox の値が空かどうかを確認します。 ButtonTest の OnClientClick を追加した後、ソース コードを再確認しました。ButtonTest コントロールによって生成されたソース コードは次のとおりです。
<input type="submit" name="ButtonText" value="Test" onclick="returnconfirm('送信してもよろしいですか?');WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(ButtonText, , true, , , false, false )) " id="ボタンテキスト" />
このコード行から、クライアント側でカスタム JavaScript が最初に実行され、次に検証コントロールによって生成された JavaScript が実行されることが明らかです。この場合、検証コントロールは失われます。いかなる意味も。
3. 応答制御
問題がどこにあるのかがわかれば、解決は簡単になります。カスタム JavaScript (returnconfirm('Are you real you want to submit?') を実行する前に、ページ上のコントロールが次の規則に準拠しているかどうかを確認します。ルールがあるため、ButtonTest の OnClientClick イベントを次のように変更しました。
次のようにコードをコピーします。
<asp:Button ID="ButtonText" runat="server" Text="Test" OnClientClick="if(CheckClientValidate()) return confirm('ページを送信してもよろしいですか?');"
CheckClientValidate() メソッドのコードは次のとおりです。
次のようにコードをコピーします。
<script language="javascript" type="text/javascript">
関数 CheckClientValidate(){
Page_ClientValidate();
if (Page_IsValid){
true を返します。
}それ以外{
false を返します。
}
}
</script>
実行してテストします。検証コントロールが機能します。問題は解決しました。
4. 追記
これは、私が無視すべき問題と解決策であると知っていたため、幸いなことに、サーバー側で厳密な検証を行っていました。ここから、厳密なサーバー側検証を指定することがいかに必要であるかもわかります :-)。これにより、「ハッカー」がクライアントの検証を回避することを防ぐだけでなく、自分自身が気付かないエラーによって引き起こされるデータの不正確性も防ぐことができます。
注記:
Page_ClientValidate()、この関数は Microsoft 検証コントロールを含む aspx ページで使用され、ユーザー入力操作が正当かどうかに基づいて True または False を返します。
直接判断できる。
次のようにコードをコピーします。
if(Page_ClientValidate())
{
true を返します。
}
それ以外
{
false を返します。
}