質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.54%

  • VB.NET

    1048questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • ASP.NET

    612questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

【ASP.NET】iframeに読み込んだaspxファイルのPage_Loadイベントに親画面で生成したクラスインスタンスを渡したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,676
退会済みユーザー

退会済みユーザー

前提・実現したいこと

お世話になります。
ASP.NETで作成された業務システムにおいて、1画面上に複数のユーザコントロールが埋め込まれたページの改修を行っています。

改修内容は、「それぞれのユーザコントロールごとにiframeでラップし、iframeの中にaspxファイルをロードする。そこにユーザコントロールを埋め込むようにする」というものです(1)。

ユーザコントロール自身には初期化用の関数が定義されており、ループ処理でユーザコントロールを埋め込むタイミングにその関数を実行しているのですが、引数として独自クラスのインスタンスを渡しています(2)。

(1)を実現する場合、ユーザコントロールを埋め込む処理を、iframe内の別のaspxファイルに記述する必要が出てくるため、今度は(2)を実現することが出来なくなります。

(1)を実現しつつ、ユーザコントロールの初期化処理にインスタンスを引数として渡すためには、どうすればよいでしょうか。

親画面のソースコード

For i = 0 To 10
    Dim c As New UserClass()

    '…中略 (UserClassの調整など)…'

    Dim pan As New Panel()
    Dim iframe As New Literal()

    'iframe内にユーザコントロールを埋め込むよう改修する
    iframe.Text = "<iframe src='hoge.aspx?controlPath=fuga" & i.ToString() & ".ascx'></iframe>"
    pan.Controls.Add(iframe)

    'pan.Controls.Add(userControl1) '改修前はここで直接ユーザコントロールを埋め込んでいた
    'userControl1.init(c)  '初期化処理もここで実行

    FindControl("親画面のdiv要素").Controls.Add(pan)
Next

iframe内のソースコード(hoge.aspx.vb)

Protected Overloads Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim controlPath As String = Request.QueryString("controlPath")

    Using userControl1 As Object = CType(LoadControl(controlPath), Object)
        userControl1.init(c) 'cが渡せない
    End Using
End Sub

制限

CookieやSessionの利用は不可

試したこと

XMLSerializerなどを利用してシリアライズし、QueryStringとしてクラスインスタンスも渡す方法を一度試したところ、クラスインスタンスのプロパティでエラーが発生し、シリアライズがそもそも上手くできませんでした。また、ブラウザのクエリパラメータ文字数制限にひっかかることや、処理の複雑化が発生することを考慮してひとまず断念しました。

補足情報(言語/FW/ツール等のバージョンなど)

Microsoft .NET Framework 3.5

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

A.aspx ページの Page_Load で初期化した UserClass クラスのインスタンスを、B.aspx に Page_Load 時点で渡すということがしたいのに、Session、Cookie は使用禁止で、QueryString はそもそもシリアル化ができないのでダメということですと、残る手段はアプリケーション状態とかキャッシュぐらいしかなさそうですが、それも使えないのでしょうね。

とすると、今のやり方を根本的に変えない限り、手の打ちようがないと思うのですが。

UserClass というのが具体的になんだかわからないので可能かどうか不明ですが、UserClass のインスタンスを渡すというやり方を変えて、UserClass の初期化に必要な情報を QueryString で渡せる形にして A.aspx から B.aspx に渡し、UserClass のインスタンスの生成と初期化は B.aspx で行う他手はなさそうな気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/09 10:13

    > SurferOnWww 様
    回答いただき、ありがとうございます。

    > 残る手段はアプリケーション状態とかキャッシュぐらいしかなさそうですが、
    > それも使えないのでしょうね。

    仰るとおりで、使用禁止です。

    > UserClass のインスタンスを渡すというやり方を変えて、
    > UserClass の初期化に必要な情報を QueryString で渡せる形にして

    こちらの件ですが、UserClassのメンバには別クラスのコレクションが複数ぶら下がっていたりします。初期化するにはあまりにもパラメータが多く、ユーザコントロールを埋め込む以前・以後のロジックにおいても、依存性が強すぎる状態です(ByRefで更新されたUserClassを親画面に返す処理など頻繁にあります)

    > 今のやり方を根本的に変えない限り、手の打ちようがないと思うのですが。

    やはりプログラムの根底から改変しなければ難しいですよね…。
    そこの認識が誤っていないか、確認の意味も含め質問いたしました。

    これ以上の回答も必要ないと思いますので、
    ベストアンサーに選ばせていただきます。ありがとうございました。

    キャンセル

同じタグがついた質問を見る

  • VB.NET

    1048questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • ASP.NET

    612questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

  • トップ
  • ASP.NETに関する質問
  • 【ASP.NET】iframeに読み込んだaspxファイルのPage_Loadイベントに親画面で生成したクラスインスタンスを渡したい