none
Page.IsValidがFalseのときの処理 RRS feed

  • 質問

  • Microsoft Visual Web Developer 2010 Expressを使ってVBでWEBアプリを作っています。
    .NET Frameworkは4.5です。
    検証コントロールの
    ・RequiredFieldValidator
    ・RegularExpressionValidator
    ・ValidationSummary
    を使っており、Page.IsValidがFalseの時に行う処理を記述しているのですが実行されません。
    たとえば
    --------------------------------------------------------------------
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    If Page.IsValid Then
    Label.Text = "OK"
    Else
    Label.Text = "NG"
    End If
    --------------------------------------------------------------------
    上記実行すると、正のときラベルに「OK」は出るのですが、偽の時にValidationSummaryに他の検証コントロールで設定しておいたエラーメッセージが表示はされますがラベルには「NG」が出てきません。
    偽の時に何らかの動作をさせたいときはどのように対応したらよいでしょうか。
    • 移動 星 睦美 2015年8月5日 4:42 VBA から
    2015年8月3日 7:08

回答

  • > 上記実行すると、正のときラベルに「OK」は出るのですが、偽の時にValidationSummary
    > に他の検証コントロールで設定しておいたエラーメッセージが表示はされますがラベルに
    > は「NG」が出てきません。
     
    その理由は、RequiredFieldValidator, RegularExpressionValidator はデフォルトでクライアント側でも JavaScript による検証がかかるようになっていて、クライアント側での検証結果が NG の時はポストバックがかからないからでしょう。

    > 偽の時に何らかの動作をさせたいときはどのように対応したらよいでしょうか。

    クライアント側での検証を無効にする(EnableClientScript プロパティを false にする)ことでポストバックはかかるので望む動作をするようになると思います。

    でも、せっかくデフォルトでかかるようになっているクライアント側での検証を無効にするのは避けたいですよね。

    どういう目的か分かりませんが、別のやり方を考えた方がよさそうです。

    何がしたいのかを全体のシナリオを含めて書いていただけるとそのあたりの提案もできると思います。


    Microsoft の管理者の方>

    質問者さんは VBA のフォーラムに投稿されてますが、質問内容からすると ASP.NET のフォーラムの方が適当です。移動をお願いします。




    • 編集済み SurferOnWww 2015年8月3日 7:41 一部変更&誤字訂正
    • 回答の候補に設定 星 睦美 2015年8月6日 5:24
    • 回答としてマーク shima-008 2015年8月6日 8:56
    2015年8月3日 7:36

すべての返信

  • > 上記実行すると、正のときラベルに「OK」は出るのですが、偽の時にValidationSummary
    > に他の検証コントロールで設定しておいたエラーメッセージが表示はされますがラベルに
    > は「NG」が出てきません。
     
    その理由は、RequiredFieldValidator, RegularExpressionValidator はデフォルトでクライアント側でも JavaScript による検証がかかるようになっていて、クライアント側での検証結果が NG の時はポストバックがかからないからでしょう。

    > 偽の時に何らかの動作をさせたいときはどのように対応したらよいでしょうか。

    クライアント側での検証を無効にする(EnableClientScript プロパティを false にする)ことでポストバックはかかるので望む動作をするようになると思います。

    でも、せっかくデフォルトでかかるようになっているクライアント側での検証を無効にするのは避けたいですよね。

    どういう目的か分かりませんが、別のやり方を考えた方がよさそうです。

    何がしたいのかを全体のシナリオを含めて書いていただけるとそのあたりの提案もできると思います。


    Microsoft の管理者の方>

    質問者さんは VBA のフォーラムに投稿されてますが、質問内容からすると ASP.NET のフォーラムの方が適当です。移動をお願いします。




    • 編集済み SurferOnWww 2015年8月3日 7:41 一部変更&誤字訂正
    • 回答の候補に設定 星 睦美 2015年8月6日 5:24
    • 回答としてマーク shima-008 2015年8月6日 8:56
    2015年8月3日 7:36
  • 【追伸】

    クライアント側での検証 NG で Label に結果を表示したい場合は、クライアントスクリプトで行うことになりますが、それは以下の記事の応用でできると思います。

    クライアント側での検証結果の表示
    http://surferonwww.info/BlogEngine/post/2013/08/01/showing-the-results-of-validations-at-client-side.aspx

    2015年8月3日 8:12
  • 早々にご回答いただきましてありがとうございます。わかりやすいご説明で助かりました。また投稿場所のご指摘もありがとうございます。

    今回の質問は、SQL Server上のデータベースにブラウザ(aspxファイル)からデータを追加する時の処理の一部を抜き出しました。

    ドロップダウンリストの選択結果とテキストボックスの入力内容を、登録ボタンを押すとエラーの判定を検証コントロールで行い、

    エラーが無ければデータベースに追加するクエリ文を実行、さらにドロップダウンリストとテキストボックスを初期状態にした上でラベルに「OK」、

    エラー発生時はValidationSummaryにメッセージを表示させた上でラベルを空欄(上記質問では「NG」と記載しましたが)にしたかったのです。

    現状だと複数回つづけてデータを追加しようとしたときに、1回目の登録が問題なく終わりラベルに「OK」が出た状態で2回目の登録を行うとエラーが発生する場合「OK」が残ったままValidationSummaryにメッセージが出てしまう仕様です。

    と、ここまで書いていて気づいたのですが、ドロップダウンリストで何らかの選択をしたときは常にラベルを空欄にするようにしておけば完璧ではないにしても望むような結果に近い形になりそうです。



    • 編集済み shima-008 2015年8月4日 5:37
    2015年8月4日 5:35
  • 結局、

    > ドロップダウンリストで何らかの選択をしたときは常にラベルを空欄にするようにして
    > おけば完璧ではないにしても望むような結果に近い形になりそうです。

    という対策を取ることで問題は解決ということでしょうか?

    解決ということでしたら、役に立った回答にチェックマークを付けて、このスレッドはクローズしていただくようお願いします。

     
    質問とは直接関係ないことですが、一つ気になったことを書いておきます。

    Web アプリケーション開発の基本として、Post/Redirect/Get (PRG) パターンを使う・・・即ち、POST 要求への応答をそのまま返すのは検証結果 NG の場合のみとし、検証結果 OK の場合は、例え同じページを表示するにしても、リダイレクトしてブラウザに GET 要求させるのがよいそうです。

    理由は、ユーザーが F5 キーを押すなどしてページをリフレッシュすると POST 要求がかかり、以下の記事の図3にあるような警告(場合によっては警告だけでなく好ましからざる副作用も)が出るからです。

    第28回 フォーム送信とブラウザ・ボタンと使い勝手(前編)~PRGパターンをご存じですか
    http://itpro.nikkeibp.co.jp/article/COLUMN/20071112/286994/

    2015年8月4日 7:01
  • Microsoft の管理者の方にお願い
     
    先にもお願いしましたが、フォーラムの移動をしていただけないでしょうか? 質問内容からすると ASP.NET のフォーラムの方が適当と思います。少なくとも VBA と関係する質問では全くないはずです。
    2015年8月5日 1:27
  • フォーラム オペレーターの星 睦美です。

    今回はshima-008 さんが投稿したVBA フォーラムからASP.NET フォーラムにスレッドを移動いたしました。投稿した質問はフォーラム ページの左上、[クイック アクセス] > マイ スレッドから確認できます。

    フォーラム ユーザーからの回答が参考になりましたら、投稿者からの[回答としてマーク] をお願いします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年8月5日 4:52
  • このたびは複数回に渡っていろいろとご説明やアドバイス等いただきまして本当にありがとうございました。

    おかげさまでなんとか形に持っていくことができました。

    ドロップダウンリスト選択時にラベルを空にするという対応ですのでとりあえずという感じではありますが、今後もっとスキルをあげてご案内いただいた内容を反映させられるよう頑張ります。

    ありがとうございました!

    2015年8月6日 4:40