@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

CustomValidatorを使用してもサーバのボタン押下処理が実行されてしまう

1
投稿者投稿内容
apo
常連さん
会議室デビュー日: 2008/11/10
投稿数: 27
投稿日時: 2009-04-09 10:22
現在、asp.net/VBの言語で開発をしています。
画面のテキストボックスに入力されたコードがデータベースに登録されているかを確認し、登録されていればエラー、登録されていなければ、追加ボタンの押下処理を実行するという仕様
追加ボタン押下時にこの判定処理を行うよう画面の設定をしています。

※以下ソース、画面の上部にValidationSummaryでエラーを表示する部分があります。
<table cellpadding="0" style="margin-top:0px">
<tr>
<td class="tableOuter_border">
<asp:ValidationSummary ID="validationSummary1" runat="server"
Height="100px" stle="margin-left:0px" Width="792px"
ShowMessageBox="false" ValidationGroup="empCd_req"/>
</td>
</tr>
</table>

そして、コードを入れるテキストボックスがあります。↓
<asp:TextBox ID="txtEmpCd" runat="server"
CssClass="default" Text=""
Width="60px" MaxLength="8" style="ime-mode: disabled"></asp:TextBox>

このテキストボックスのエラーチェック処理が以下になります。
<!-- 入力チェック Start -->
<asp:RequiredFieldValidator ID="rfvEmpCd" runat="server"
ControlToValidate="txtEmpCd"
ErrorMessage="コードを入力してください"
Display="Dynamic" Text="*" ValidationGroup="empCd_req">
</asp:RequiredFieldValidator>

<asp:CustomValidator ID="cvalEmpCd" runat="server"
Display="Dynamic" ErrorMessage="" Text="*" OnServerValidate="cvalEmpCd_ServerValidate"
ControlToValidate="txtEmpCd" ValidationGroup="empCd_req" >
</asp:CustomValidator>
<!-- 入力チェック End -->

このCustomValidatorのサーバーの処理で、データベースのレコード存在チェックをしています。
以下、サーバの処理です

Protected Sub cvalEmpCd_ServerValidate(ByVal source As Object, _
ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) _
Handles cvalEmpCd.ServerValidate
' 変数の宣言
Dim iRet As Integer
Dim empCoad As String '社員コード
Dim param As String() 'エラーメッセージに使用するパラメータ
Dim strErrMsg As String 'エラーメッセージを入れる箱
Dim retDt As DataTable
Dim pdtOut As New DataTable

empCoad = Me.txtEmpCd.Text

Try
' 社員情報テーブルに登録する社員コードが存在するか確認する処理
iRet = checkMethod(empCoad, pdtOut)
If iRet = 0 Then
strErrMsg = "該当するデータがありません。"
args.IsValid = False
End If

Catch ex As Exception
Me.ShowException(ex)
End Try
End Sub

そして、以下は追加ボタンのサーバーの処理です。
Private Sub btnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click
 ここの処理に、上記cvalEmpCd_ServerValidate関数の処理でargs.IsValid=False
としても、入ってきます。
 私がしたいのは、
上の関数でargs.IsValidにしたら、この追加処理には入らないようにしたいのです。

誰かわかりましたらご説明していただけないでしょうか。

よろしくお願いします
タコツボ
常連さん
会議室デビュー日: 2004/01/20
投稿数: 22
お住まい・勤務地: 京都・大阪
投稿日時: 2009-04-09 13:31
Validatorの使い方としては、Clickイベントハンドラ内でIsValid値を判定するというのが本来のやり方ではないでしょうか。

http://www.atmarkit.co.jp/fdotnet/dotnettips/244aspcustvali/aspcustvali.html
>Sub objBtn_Click(sender As Object, e As EventArgs)
> If Page.IsValid Then
> ' 検証に成功した場合の処理を記述
> End If
>End Sub


引用:

Private Sub btnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click
 ここの処理に、上記cvalEmpCd_ServerValidate関数の処理でargs.IsValid=False
としても、入ってきます。
 私がしたいのは、
上の関数でargs.IsValidにしたら、この追加処理には入らないようにしたいのです。


btnAdd_Clickは、あくまで「ボタン押下時の処理」であって、「追加処理」とは別と考えればよいのではないでしょうか。

「ボタン押下時」に、「入力内容に問題があった場合には追加処理を行わず、次の画面へ遷移しない」、ということかと。
apo
常連さん
会議室デビュー日: 2008/11/10
投稿数: 27
投稿日時: 2009-04-09 17:13
ありがとうございます。
アドバイスを参考にして、処理を追加しましたら、うまくいきました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-04-09 22:17
まずはドキュメントに尋ねましょう。
引用:

CustomValidator クラスより:
検証コントロールを使用する場合は、処理を実行する前に、サーバー側での検証の結果を常に確認する必要があります。ポストバックの後、イベント メソッドが呼び出される前に、ページは検証コントロールを呼び出して、結果を Page.IsValid プロパティに集約します (Validate メソッドを使用して、検証コントロールを明示的に呼び出すこともできます)。独自のコードでは、入力を処理する前に、Page.IsValid プロパティが true を返すことを確認する必要があります。検証チェックが失敗した場合、スクリプト対応のブラウザはポストバックが発生しないようできますが、検証されたデータを処理する前に、サーバー コードの Page.IsValid を常に確認することも必要です。


1

スキルアップ/キャリアアップ(JOB@IT)