- PR -

ユーザーコントロールでのJavascript登録について

投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2008/01/15
投稿数: 65
投稿日時: 2008-03-12 18:43
お世話になっております。
VS2005のWEBサイトを構築しているのですが、ユーザーコントロールのPage_Loadで使用するパラメタの設定方法を教えてください。

動作としては次のようなことをしたいのです。

1.データの編集画面に、実際の表示を確認するために「別画面を開く」ボタンをつける。
2.「別画面を開く」ボタンを押すと、新しいウインドウを開いて渡されたURLを表示する。

上記のことを実現するために、「別画面を開く」のonClickでwindow.openのjavascriptを登録しています。
javascriptには、現在編集しているIDを渡します。

ユーザーコントロールを使っていなければPageLoadで上位から渡されたパラメタを解析してjavascriptに渡すだけなので問題ないのですがユーザーコントロールだと上手く値を渡すことができず困っています。


ユーザーコントロール側にはプロパティを用意していてパラメタの受け渡しをするようにしているのですが、
ボタンクリックでJavascriptをパラメタ付で呼ぶために、ユーザーコントロールのPage_Loadで受け取るはずのプロパティ値を参照しています。
ところが、プロパティを設定するより先にPage_Loadが走る(考えてみれば当たり前)ため、必要なパラメタを受け取ることができません。
そこで、プロパティをあきらめ、ViewState、Sessionに変更しましたが、やはりユーザーコントロールのPage_Loadが先に走ってしまいます。


Q1.ユーザーコントロールのPage_Loadで必要なパラメタを受け取るためにはどうしたら良いのでしょうか?
Q2.Javascriptの登録はPage_Loadより後ろにずらすことはできないのでしょうか?
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-03-12 20:33
話が見えてこなかったので外れたらごめんなさい

Q1. UserControlにPageがあるのでPageと同様の処理はできます。

Q2. Load後でも問題ないです。

参考になればと思います。
RapidExpress
常連さん
会議室デビュー日: 2007/11/11
投稿数: 42
お住まい・勤務地: おおさか
投稿日時: 2008-03-13 09:33
あくまで個人的な考えということで聞き流していただければと思いますが、
クリックして、サーバ側で値を取得してスクリプトを登録したい場合は
OnClickにスクリプトを登録するのではなく、ボタンのクリックイベントなどで
スクリプト文字列を生成し、ClientScript.RegisterStartupScriptなどで
登録するという手順を私は使います。

ポストバックを許さない状況なのであれば話が変わってきますが。
未記入
ベテラン
会議室デビュー日: 2008/01/15
投稿数: 65
投稿日時: 2008-03-13 10:38
引用:

RapidExpressさんの書き込み (2008-03-13 09:33) より:
あくまで個人的な考えということで聞き流していただければと思いますが、
クリックして、サーバ側で値を取得してスクリプトを登録したい場合は
OnClickにスクリプトを登録するのではなく、ボタンのクリックイベントなどで
スクリプト文字列を生成し、ClientScript.RegisterStartupScriptなどで
登録するという手順を私は使います。

ポストバックを許さない状況なのであれば話が変わってきますが。



なんとなくRegisterStartupScriptという名称からしてページロードの後で登録しても手遅れのような気がしますが気のせいでしょうか?
(クリックが発生したタイミングでは既に画面は表示されている訳ですから)
イメージとしては、クリックイベントが発生したタイミングで直接Javascriptを実行して別ウインドウを開く感じになると思うのですが、私はこれができないと思い、ボタンのonClickでjavascriptを実行することしか思いつきませんでした。

どんな形であれ、ボタンを押したタイミングで(任意のURLを指定して)別ウインドウを開ければ良いので、具体的にどのようにClientScript.RegisterStartupScriptを使ったら良いのか教えて頂けないでしょうか。
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2008-03-13 11:13
えーと要は、
ユーザコントロール側で公開しているプロパティを、ユーザコントロールの利用元のページから設定するけれども、ユーザコントロール側の Page_Load で JavaScript の編集コードを書いてしまっているから間に合わない、っていう話ですよね?

違っていたら読み飛ばしてください。

ユーザコントロール側で JavaScript を編集するコードを例えば Page_PreRender 内に書けば済むかと。
(で、ユーザコントロールの利用元では、Page_Load 内でユーザコントロールのプロパティを設定してやる。)

#括弧内を追記

[ メッセージ編集済み 編集者: まるく 編集日時 2008-03-13 11:15 ]
RapidExpress
常連さん
会議室デビュー日: 2007/11/11
投稿数: 42
お住まい・勤務地: おおさか
投稿日時: 2008-03-13 11:16
引用:

なんとなくRegisterStartupScriptという名称からしてページロードの後で登録しても手遅れのような気がしますが気のせいでしょうか?
(クリックが発生したタイミングでは既に画面は表示されている訳ですから)


確かに、クライアント側のOnClickで開いた場合はクリックした時点で開かれます。
しかし、一旦ポストバックが発生した場合、返ってくるHTMLが確定するのは
サーバ側での処理がすべて終わった後です。スクリプトが実行されるのはそのHTNLが
ロードされた後になりますので。ウィンドウがオープンするときにはサーバ側での
処理はすべて終了しているということになります。実装は以下のとおりです。

コード:

    '別窓で開く ボタンのクリックイベント
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim val As String
        '任意のURLを設定
        val = "nantarakantara.aspx"
        Page.ClientScript.RegisterStartupScript(Me.GetType, "OPENWINDOW", "window.open('" & val & "');", True)
    End Sub



未記入
ベテラン
会議室デビュー日: 2008/01/15
投稿数: 65
投稿日時: 2008-03-13 11:40
引用:

RapidExpressさんの書き込み (2008-03-13 11:16) より:
確かに、クライアント側のOnClickで開いた場合はクリックした時点で開かれます。
しかし、一旦ポストバックが発生した場合、返ってくるHTMLが確定するのは
サーバ側での処理がすべて終わった後です。スクリプトが実行されるのはそのHTNLが
ロードされた後になりますので。ウィンドウがオープンするときにはサーバ側での
処理はすべて終了しているということになります。実装は以下のとおりです。

コード:

    '別窓で開く ボタンのクリックイベント
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim val As String
        '任意のURLを設定
        val = "nantarakantara.aspx"
        Page.ClientScript.RegisterStartupScript(Me.GetType, "OPENWINDOW", "window.open('" & val & "');", True)
    End Sub







シンプルな実装方法を教えていただきありがとうございます。
お蔭様でウインドウを開くことができました。
欲を言えば、この方法だとIEのポップアップブロックに引っかかってしまいます。
ポップアップブロックに引っかからないように別ウインドウを開くことはできないのでしょうか?
※もしかすると私のコードが間違っているのかも知れませんが・・・
RapidExpress
常連さん
会議室デビュー日: 2007/11/11
投稿数: 42
お住まい・勤務地: おおさか
投稿日時: 2008-03-14 10:59
引用:

欲を言えば、この方法だとIEのポップアップブロックに引っかかってしまいます。
ポップアップブロックに引っかからないように別ウインドウを開くことはできないのでしょうか?


ポップアップブロックの件はすっかりど忘れしてました。申し訳ありません。

これはOnClickなど以外からのスクリプトによるオープンはブロックしてしまいますので、
ポストバック完了時に自動的に実行させるこの方法ですと回避手段はありません。

なので、どうしても回避したい場合はやはり、上でも挙げられているように
処理するイベントをずらすなどしてロード完了までにパラメータを確定させ、
OnClick(OnClientClick)にセットする必要があります。

後はこんなやり方とか。
コード:
<script runat="server">
    Private Function GetOpenDestination() As String
        ' 値取得
        Return "detarame.aspx"
    End Function

</script>
<script language="javascript" type="text/javascript">
    var dst = '<%= GetOpenDestination %>';
    
    function OpenWindow()
    {
        window.open(dst);
    }
</script>


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