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

確認ダイアログと検証コントロール

1
投稿者投稿内容
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-03-29 16:50
いつも参考にさせていただいております。

VS.NET2005 ASP.NET(VB) SQL-SEVER2005 で開発しているのですが

ASP.NETでは確認ダイアログを出力する際に
MsgBox関数が使用できないことを知り、ここの掲示板で対処法を見つけ対応しました。

Button1.OnClientClick = "return confirm('更新します。よろしいですか?');"

このようにボタンにクライアント側で処理するJavaを書いて
OKの時にクリックイベントに来るようにはなったのですが

このボタンに検証コントロールのエラーメッセージが絡んだ場合どのようにすればいいか困っております。

上記のままで実装しますと
---------------------------
ボタンクリック

確認ダイアログ表示
↓ok
検証コントロールのエラーを画面に表示(エラーメッセージダイアログは出力されない。)
↓(エラーがなければ)
更新処理
---------------------------

となるのですが、MsgBox関数を使用した時のように
---------------------------
ボタンクリック

検証コントロールのエラーメッセージダイアログ表示
↓(エラーがなければ)
確認ダイアログ表示
↓ok
更新処理
---------------------------
このような流れにするためにはどのようにしたらいいのでしょうか。

どうぞ、ご教授のほどよろしくお願い致します。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2007-03-29 22:08
検証コントロールというのはASP.NET標準の検証コントロール ( RequiredFieldValidatorなどのコントロール ) のことですよね?
で、検証コントロールの表示するエラーメッセージというのは、クライアントスクリプトが表示するエラーメッセージのことですよね? ( よくわからなかったら、検証コントロールのEnableClientScriptプロパティが true であるかどうかを確認して報告してください。 )
一応、これらを前提に話を進めさせて頂きます。


OK ボタンの OnClientClick プロパティに指定したクライアント スクリプトは、
検証コントロールが実行するクライアント スクリプトより先に実行されます。
これは覆せません。
ではどうするかというと、いくつか方法があります。
実用的な案として思いつくのは以下の2つです。

1. Form の onsubmit イベントを利用する
Form タグの onsubmit 属性にて確認ダイアログを表示するようにします。
こうすることによって、ポストバックが発生するたびに、ポストバックの直前で確認ダイアログが表示されます。onsubmit で実行されたスクリプトが true を返せばポストバックが行われ、 false を返せばポストバックが行われません。
ただしこれだけでは、ボタン以外のコントロールで発生するポストバックに対しても確認ダイアログが表示されてしまいます。
なので、ボタンの OnClientClick プロパティにて何らかのフラグをセットし、このフラグを確認ダイアログの表示条件とします。

2. 確認ダイアログの代わりに確認ページを使う
そのままです。確認ダイアログを使わず、代わりに自作の確認ページを表示します。

確認ダイアログにこだわるのなら前者、こだわらないのなら後者の方がいいかなと思います。

# ちなみに、"Java"ではなく"JavaScript"が正しいです。JavaとJavaScriptは別物です。
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2007-03-30 01:43
直接の回答ではありません。

引用:

なんとかさんの書き込み (2007-03-29 16:50) より:
ASP.NETでは確認ダイアログを出力する際に
MsgBox関数が使用できないことを知り、


とありますが、『なぜASP.NETでは、MsgBox関数で利用者の画面に確認ダイアログを表示できないのか』の本質的な理由を理解されているでしょうか?

MsgBox関数という言葉が出てきているので過去にVB6をご使用だったのだと思いますが、『VB6とASP.NETは、全くの別物』だと思った方がよいです。
確かにASP.NETではVB6とよく似た文法のVB.NETを利用できますが、それに惑わされてはいけません。繰り返しますが、全く異なる技術です。

なので、
VB6っぽいUIを設計してしまうと、大抵破綻します。
ASP.NET(というかWebアプリ)の仕組みを理解した上で、それに沿ったUIとされることをお勧めします。

以上、ちょっときになってしまったので。
# 上記を承知の上でのご質問でしたら、大変失礼致しました。

<余談>
最近はAjaxとかでVB6っぽいUIのWebアプリも多く見かけるようになりました。ただ、それらもWebアプリのテクノロジにのっとり、さらに酸いも甘いも噛み分けた上で作成されています。
</余談>

で、ちょっと本題。
よこけんさんご提示の方法(1)の場合、
 クライアント側エラーチェック
  ↓ (エラーがなければ)
 確認ダイアログ
  ↓(OK押下でsubmitされる)
 サーバ側エラーチェック
となります。
サーバ側エラーチェックは、確認ダイアログ表示後になります。
これの意味するところは分かりますか?
# って、ちょっといじわるな聞き方になってしまった。
# 要は、なんとかさんの理解度を知りたいのです。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2007-03-30 06:17
検証コントロールでエラーが検出されたかどうかを、
どのようにチェックするかがポイントになります。

コード:
      <span onclick="return confirmOrder('注文してよろしいですか?');">
        <asp:Button id="btnOrder" runat="server" 
          Text="注文" CausesValidation="False" />
      </span> 



ソースコードはこちらのサンプルを参考にしてください:
http://akiokasai.qsh.eu/Goto.aspx?id=061010-1

数量を空白にして[注文]ボタンをクリックしてみてください。
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-04-02 11:00
返答が遅れまして申し訳ありませんでした。
みなさんご返答のほうありがとうございました。

私としてはHeさんのおっしゃる通りVB6.0をやっていて
はじめてのASP.NETの開発と言うこともありプログラミングを
VB6.0のニュアンスで組んでいました。
テストしているうちにいろいろ違うところを理解しつつ開発している次第です。

 クライアント側エラーチェック
  ↓ (エラーがなければ)
 確認ダイアログ
  ↓(OK押下でsubmitされる)
 サーバ側エラーチェック

この場合クライアント側のJavaScriptでチェックしポストバック後に
サーバ側の処理に移ると理解していますがいかがでしょうか。

ASP.NETについては初心者ですので、
ここでのご返答についてはとても参考になり助かっております。

Accessさんの方法を試してみようと思ったのですが
メッセージのほうが動的に変わるようなボタンもありまして
<span>タグのonclickのほうをASP.NETのほうで
どう対処していいかわからない次第です。

初心者すぎて申し訳ないです。

[ メッセージ編集済み 編集者: なんとか 編集日時 2007-04-02 11:20 ]
なんとか
常連さん
会議室デビュー日: 2007/02/21
投稿数: 20
投稿日時: 2007-04-02 13:31
Accessさんのコードをいろいろ試してみて<span>に書かなくても
ボタンのonclickに書けば正常に動作しました。
これで、メッセージ文章の変更をASP.NET側のコードでできます。

<asp:Button runat="server" onclick="return confirmOrder('注文してよろしいですか?');"
id="btnOrder" Text="注文" CausesValidation="False" />

ご教授ありがとうございました。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2007-04-02 14:38
引用:
ボタンのonclickに書けば正常に動作しました。
これで、メッセージ文章の変更をASP.NET側のコードでできます。

<asp:Button runat="server" onclick="return confirmOrder('注文してよろしいですか?');"
id="btnOrder" Text="注文" CausesValidation="False" />



ん?onclick ではなく OnClentClick の書き間違い、もしくは asp:Button タグではなく、 button タグの書き間違いでしょうか。
そのコードだとビルドすら通らないかと思います。


余談ですが、span をサーバーサイドで扱うことは可能です。
span タグに id 属性と runat 属性を付けるだけです。
ただし、onclick というプロパティは用意されていないので、Attributesプロパティにて追加したりする必要があります。
まぁ、なんとかさんのボタンに confirmOrder 関数を呼び出すコードを書くという対処法で問題ないはずなので、もはやどうでもいい話ですが^^;
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2007-04-03 00:35
既に解決されているようなので、単なるお節介になってしまいますが、

引用:
なんとかさんの書き込み (2007-04-02 11:00) より:
この場合クライアント側のJavaScriptでチェックしポストバック後に
サーバ側の処理に移ると理解していますがいかがでしょうか。


流れとしてはそのようになります。

ところで、検証コントロールのエラーチェックはクライアント側のみで行われているわけではないことをご存じですか?
また、CustomValidatorを使用した時などに、クライアント側でのエラーチェックが行えない場合があることも理解されているでしょうか?

しつこいようですが、WebアプリにはWebアプリの作法があります。
何ができて何ができないのかの判断がつけられるようになっておいた方が、何かとトクですよ。

なんとかさんの解決方法がいけないと言っているわけでは無いです。誤解無きよう。
ただ、その解決方法が本当に要件を満たしているかどうかの判定をなんとかさんご自身でつけられますか? ってところが気になります。
# 無論、私が勝手に気にしているだけですので、
# なんとかさんがご承知の上でしたら、上記は読み捨てて頂いて構いません。

以上、駄レス失礼しました。
1

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