- PR -

[ASP2.0 VS2005 CS] showModalDialog で DefaultButton 設定

1
投稿者投稿内容
けい
会議室デビュー日: 2007/11/24
投稿数: 4
投稿日時: 2007-11-24 19:02
いつもお世話になっております
今回初めての投稿になります
よろしくお願いいたします

現在、件名環境にてモーダルのメッセージボックスを表示したいと
考えているのですが、初期表示時のフォーカスのあたるボタンを
設定しても初回のみ有効であり、2回目以降が設定外の
ボタンになってしまいます。
キャッシュ等が原因と思い、いろいろ試してみましたが
解決されません。


処理は下記です


呼び出し側:
string strScript =
"window.showModalDialog("
+ "'PageMessageBox.aspx'"
+ ","
+ "'メッセージボックス',"
+ "'"
+ " dialogWidth=350px"
+ ",dialogHeight=250px"
+ ",center=yes"
+ "'"
+ ");";
string startupScript =
"<script language='JavaScript'> " + strScript + "</script>";

this.ClientScript.RegisterStartupScript(
this.Header.GetType()
, "Key"
, startupScript, false);



ダイアログ側:(3つ Button があり、真ん中をデフォルトとする)

protected void Page_Load(object sender, EventArgs e)
{
this.Response.Cache.SetCacheability(
System.Web.HttpCacheability.ServerAndNoCache);
this.Response.Cache.SetAllowResponseInBrowserHistory(false);

if (!IsPostBack)
{
this.form1.DefaultButton = this.Button2.ID;
//this.form1.DefaultButton = this.Button2.ClientID;
//this.form1.DefaultButton = this.Button2.UniqueID;
}
}


同じ記述で window.open() で呼び出した場合は、
目的のデフォルトボタン設定が可能です

キャッシュを残さないようにするために HTML側に
<%@ OutputCache Duration="1" VaryByParam="none" %>
を記述しています。


以上、何か解決方法を知っている方いらっしゃいましたら
教えてくださいよろしくお願いいたします。
kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2007-11-24 22:57
今すぐに検証できそうに無いので回答にはなってなく、申し訳ないのですが……。

引用:

設定しても初回のみ有効であり、2回目以降が設定外の
ボタンになってしまいます。


この”2回目以降”というのは、『一度showModalDialogで開き、その後一度閉じて、再度showModalDialogで開いた際に期待通りに動かない』という事でよろしいでしょうか。
当初、『開いたダイアログ上でPostBackを発生、そのレスポンスで描画される画面で期待通りに動かない』のかと解釈しかけましたが、提示されたコードを見る限り前述と解釈するべきと思いましたので、とりあえずそれで続けさせていただきます。


まず、基本的なポイントなのですが、何らかの方法(ブレークポイントを張る等)で『2回目以降の呼び出しの際に該当の処理やPage_Load自体を通っているか』の確認はされましたでしょうか


Page_Load自体を通っていないようでしたら、疑っておられるようにキャッシュ関係の問題と思います。
まずは、上記の検証結果を提示されてみてはいかがでしょうか。



(誤字脱字を訂正しました。)

[ メッセージ編集済み 編集者: kiyokura 編集日時 2007-11-24 23:00 ]
けい
会議室デビュー日: 2007/11/24
投稿数: 4
投稿日時: 2007-11-25 22:13
kiyokuraさんお返事ありがとうございます

1回目に表示されるダイアログで
Button2をデフォルトにすることは可能でした。
ボタンクリックで window.close を行い
画面を閉じたあと(ダイアログは base target=_self としています)
再度 showModalDialogを起動すると
Page_Load で1回目と同じように DefaultButtonの設定を
行っているにもかかわらず、左側のButton1がデフォルトボタンに
なってしまいます。
ちなみに、Pageの全イベントで試しても同じ結果でした。

this.form1.DefaultButton = Button.ID;

とすることにより、自動的にFormの onkeypressに WebForm_FireDefaultButtonが
生成されるようですが、2回目の場合は生成されないようです。

ボタンクリック後、ダイアログを閉じるために
Page.ClientScript.RegisterStartupScript(
Page.Header.GetType(), "", "<script>window.close();</script>");

としていますが、閉じ方の問題なのでしょうか?


また、最初の質問スレッドでも書きましたが、
window.showModalDialog ではなく window.open だと、2回目以降も
Page_Load で設定した通りのデフォルトボタンにすることができます。

window.open でモーダルページを作成しようとも考えましたが
せっかくの showModalDialog と DefaultButton の機能があるので
使用したいと考えています。


以上、再度よろしくお願いいたします。
kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2007-11-26 00:34
とりあえず、後述のようなミニマムコードで試してみました。(usingとnamespaceは省いてますが、その他はそのまんまです。)

私が実行してみた環境は『Windows Vista、VS2005 PRO(SP1,Vsita用パッチ)、IE7』で、プロジェクトは「Webアプリケーション」、デバッグ実行環境は「Visual Studio開発サーバを使用」です。

そうしたところ、期待されるとおりと思われる、「何度開いてもButton2が規定ボタンとなっている」ように動作しました

ですので、まず、閉じ方の問題では無い様に思います。

そこで、しつこい様で申し訳ないのですが、
引用:
Page_Load で1回目と同じように DefaultButtonの設定を
行っているにもかかわらず、


なのですが、どのように確認されていますでしょうか。
IDE上でブレークポイントを張るなどで、二回ともその処理を通っていることをはっきり確認されていますでしょうか(失礼かとは思いますが解決の近道と思いますので、再確認させてください)。

というのも、showModalDialogの場合は通常のページ表示やwindows.openに比べ、異様に(?)キャッシュが効くようか感覚が私にある為です。
私の所でうまくいったのも、IEやOS、後はWebサーバ(IISではなく開発用サーバ)等がけいさんの環境と異なるから、という可能性もあります。
けいさんのそのあたりの環境はどのようになっているでしょうか。

月曜日の日中であればXPやIE6、IISでの動作確認ができる環境の所にいるはずですので、とりあえずまた試してみます。

#またしても回答になってなくてすみません。


コード1:開き元(フォーム上にはボタンコントロールが1つだけ)
コード:
    public partial class _Default : System.Web.UI.Page
    {
        protected void Button1_Click(object sender, EventArgs e)
        {
            string strScript =
                    "window.showModalDialog("
                    + "'WebForm1.aspx'"
                    + ","
                    + "'メッセージボックス',"
                    + "'"
                    + " dialogWidth=350px"
                    + ",dialogHeight=250px"
                    + ",center=yes"
                    + "'"
                    + ");";
            string startupScript = "<script language='JavaScript'> "
                    +strScript
                    +"</script>";
            this.ClientScript.RegisterStartupScript(
            this.Header.GetType(), "Key" , startupScript, false);
        }
    }


コード2:開かれる方(フォーム上にはボタンコントロールが3つだけ。)
コード:
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.Response.Cache.SetCacheability(
            System.Web.HttpCacheability.ServerAndNoCache);
            this.Response.Cache.SetAllowResponseInBrowserHistory(false);
            if (!IsPostBack)
            {
                this.form1.DefaultButton = this.Button2.ID;
            } 
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Page.ClientScript.RegisterStartupScript(
            Page.Header.GetType(), "", "<script>window.close();</script>");
        }
    }

kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2007-11-26 10:29
たびたび失礼します。こちらでも再現しました。
#この後、夜までは投稿できそうに無いので取り急ぎ。

コードは昨夜投稿したものと同じで、実行環境はXP、WebサーバがIIS、IE7です。

実行すると、確かに、二回目のshowModalDialogからは、フォーカスがブラウザの既定(左端のボタン)になってしまいました。

ただ、Page_Laodにブレークポイントを張って実行すると状況が異なり、毎回Page_Loadを通り、正しく意図通りのボタンがフォーカスを取得とした状態で表示されます。
#ありがちなパターンといえばありがちですね

ここでもう少し試してたところ、呼び出される側のaspx上のOutputCacheを消してみると、ブレークポイントを張っていない状態でも、少なくとも私の環境ではうまく動作するようになりました。

時間の都合で今、これ以上の追試が出来ないのですが……。
とりあえず上記を試してみてはいかがでしょうか。
原因については、後ほどいろいろ追試してみようと思うのですが、やはり何かのキャッシュ絡み(ひょっとしたら、DefaultButtonのセットで実行されるJavascript絡み)のような気もしています。


取り急ぎご報告まで。

けい
会議室デビュー日: 2007/11/24
投稿数: 4
投稿日時: 2007-11-26 20:19
kiyokura さん、お返事ありがとうございます
やっと作業できるようになったので
いろいろと試してみましたが、症状かわらずです。
こちらの環境は

OS XP-pro SP2
IIS 5.1 SP2
IE 6.0 SP2

です。
ブレークポイントを配置して
一度Page_Loadでストップさせてからデフォルトボタンを
設定するようにしても、画面が表示されたときは
左側のボタンがデフォルトになってしまうようです。

なかなか正常に動いてくれませんね・・・
DefaultButtonプロパティは ModalDialog用には
使えないものなんですかね?
1回目ができるだけに、悔しいです。
kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2007-11-26 23:07
もう少しだけ検証した結果、根本的な原因は未だ推測の域を出ないのですが、何とか私の手元の環境では対処できたようなので、ポストします。

まず、私の環境での発生状況を整理したところ、以下のような状態でした。

サーバ:
XP上のIIS(マシンは以下のPC3)

クライアント:
PC1:Vista+IE7 …… まったく発生せず。
PC2:XP+IE7 …… たまに発生?Page_Loadにブレークポイントを張ると発生せず。
PC3:XP+IE7 …… まったく発生せず
PC4:XP+IE6 …… 必ず発生(ブレークポイント有りは未検証)

以上より、サーバ側の問題ではなく、クライアント側の問題として良いと考えました。


そこで、次に疑ったのは、HTML表示後に目的のボタンにフォーカスを当てているJavascriptの処理です。
状況的に考えるのは、
 1) 何らかの原因でこのJavascriptが正常に動作していない
 2) 一度フォーカスがあたった後、何らかの原因でフォーカスが外れている
の2点と思いました。(他にあるかもしれませんが、直接的にはこの二点かと思いました)


とりあえず、Javascriptが正常動作していないならなんらかエラーがクライアント側で出そうに思ったので、2)が原因であると仮定して対処方法を試してみました。
#後者であれば、環境や状況によって左右され易そうにも思えたため。


ダイアログ以外のページでDefaultButtonを設定、ソースを表示させ、目的のコントロールにフォーカスを当てている処理が、ページの最後のほうに出力されている、
コード:
WebForm_AutoFocus('Button2');


と分かりましたので、とりあえずダイアログで表示される側のbody要素で以下のように直接呼んでやると……100%発生していたPC4でもまったく発生しなくなりました。
(Page_Load内で行っているDefaultButtonの指定の処理は、そのまま残しておいてください。WebForm_AutoFocusの実態があるJavascriptのファイルをHTMLに読み込む必要があるので)
コード:
<body onload="javascript:ebForm_AutoFocus('Button2');">


ちょっと泥臭い方法ですが、現状では、私にはこれくらいしか思いつきませんでした。
また、原因についても状況からの推測だらけなうえ、根本的な原因については良くわかっていないのですが……。

とりあえず、上記の対処方法で……現象は収束しないでしょうか。
#毎度中途半端ですみませんが……。
#真の原因(?)について分かる識者の方、もっとスマートな対処方法をご存知の方おられましたら、よろしくお願いします…。
けい
会議室デビュー日: 2007/11/24
投稿数: 4
投稿日時: 2007-11-27 21:07
kiyokuraさん

ありがとうございました
できました

なるほど・・・タイミングの問題だったんですかね?
showModalDialogは無理かと諦めかけてたので
大変良かったです。

また、何かの機会にお願いいたします。
1

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