読者です 読者をやめる 読者になる 読者になる

ぺやろぐ

ゲームと奈々ちゃんと時々プログラミング

〔C#〕〔ASP.NET〕showModalDialogの呼び出し時に親画面のスクロール位置が初期位置に戻ってしまうのを防ぐ

C# 技術

ASP.NETは難しいねってお話。

目的
JavaScriptで子画面を表示した時に親画面のスクロール位置を保持できるようにする。

経緯
ASP.NETで開発をしていて、子画面を表示した時に親画面のスクロール位置がリセットされた。
MaintainScrollPositionOnPostbackをtrueにしているにも関わらず……。

子画面はJavaScriptのwindow.showModalDialogを使用して開いている。
ボタンクリックイベントからJavaScriptの設定をしている。

とまぁ、こんな状況だったんで解決方法を調べてみると意外と見つからなくて少々困った。(よくある話だと思ってた)
結局、微妙な英語力を頼りに見つけたのが以下の記事
https://forums.asp.net/t/1759352.aspx?call+function+after+maintainScrollPositionOnPostback+

なんとなーく、同じ悩みな気がする……。
これかなってことで、ごちょごちょしてみると期待通りの動きをしたので日本語版としてここに残しておこうと思う。

実装
以下コード

aspx.cs

protected void Button1_Click(object sender, EventArgs e)
{
// 何かしらの処理

StringBuilder script = new StringBuilder();
// 重要なのは↓
script.Append("<script language='JavaScript'> if (WebForm_RestoreScrollPosition) WebForm_RestoreScrollPosition();");
		script.Append("window.showModalDialog('hoge.aspx', window, 'dialogWidth: 300px; dialogHeight: 200px; center; scroll=0; status=0,location=0');</script>");
		
		ClientScriptManager csMgr = Page.ClientScript;
		csMgr.RegisterStartupScript(this.GetType(), "DoOpenScript", script.ToString(), false);
	}

細かい動きが追えていないので、はっきりとは言えないがどっかのタイミングでスクロール位置がリセットされるのを、「if (WebForm_RestoreScrollPosition) WebForm_RestoreScrollPosition();」この1文(2文?)で再度セットしているみたい。
個人的には原理不明のまま使うのは嫌なんだけど、検索力が低いためこれに関する情報が手に入らなかった……。(英語が読めていないだけの可能性……)

MaintainScrollPositionOnPostbackをtrueにしている時はhtmlソースに「window.onload = WebForm_RestoreScrollPosition;」が追加されるので、あながち変な実装でもないと思いたい。(願望


まとめ
こんな中途半端な状態で記事にするのはどうかと思ったけど、同じような悩みの人の足掛かりにでもなれれば幸い……。
詳しい方はぜひコメントをお願いいたします。