none
作ったクラスの内容はどうやって保持するのでしょう RRS feed

  • 質問

  • [Class1.vb]
    Imports Microsoft.VisualBasic

    Public Class Class1
        Private b

        Property a()
            Get
                Return b
            End Get
            Set(ByVal value)
                b = value
            End Set
        End Property
    End Class

    [Default.aspx.vb]
    Partial Class _Default
        Inherits System.Web.UI.Page
        Private c As New Class1

        Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            c.a = TextBox1.Text
        End Sub

        Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
            TextBox2.Text = c.a
        End Sub
    End Class

    と言う二つのファイルがあり、Default.aspx.vbでClass1.vb(App_Code内にあります)を使おうとしているのですが
    Button1でc.aにテキストボックスの値を代入しても
    Button2でc.aからは値が取り出せません。
    永続的にcを保持するにはどのようにしたらいいのでしょう
    2007年4月23日 16:45

回答

  • なぜ動かないのかは既に説明が出ている通りです。Class1のインスタンスをSession変数などに入れて、持ちまわる必要があります。Loadイベントは以下のような感じになります。あとは、Class1のインスタンスの内容が変わる度に、Session変数に入れなおして下さい。

     

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

            If Not Page.IsPostBack Then

                c = New Class1()

                Session("instanceClass1") = c

            Else

                c = Session("instanceClass1")

            End If

        End Sub

    2007年4月24日 5:44
    モデレータ

すべての返信

  • 逆に質問ですが、インスタンスは同一だと思いますか?
    またそれを確認しようとしましたか?
    2007年4月24日 0:33
  • これは、クラスから生成されたオブジェクトが保持できないという問題ではありません。

    問題を更に単純にするために、Class1 からオブジェクトを生成するのではなく、String 型の変数で試してみて下さい。

    同じように値は保持されない筈です。

     

    何故なら、Web の動作は、サーバーが要求を受け取った・・・つまりあなたのアプリケーションがクライアント側からの要求を受け取って、これに準じた HTML データをクライアントに返すとうい処理で完結するからです。

    上記の処理に置き換えると、Button1_Click によって最初の処理は完結し、Button2_Click で別途処理が完結します。

     

    ですから、値が保持されないのです。

     

    逆にサーバー側で動作するアプリケーションの立場として考えると、2台のクライアントから交互に要求を送られた場合、両者間で値が共通して使われたら処理はめちゃくちゃになってしまいます。

     

    値を保持するには、1回目の要求と2回目の要求が同じクライアントからのものであることを判断して、1回目の要求の時の値が何であったのかを取り出す方法が必要になります。

    具体的な内容は長くなる(今でも十分に長い訳ですが)ので、書籍や入門用のサイトなどを一通り読んで理解することをお勧めします。

     

    #それ以前に、僕自身が ASP.NET  で開発した経験がないので、外していたらごめんなさい。

    2007年4月24日 0:55
  • なぜ動かないのかは既に説明が出ている通りです。Class1のインスタンスをSession変数などに入れて、持ちまわる必要があります。Loadイベントは以下のような感じになります。あとは、Class1のインスタンスの内容が変わる度に、Session変数に入れなおして下さい。

     

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

            If Not Page.IsPostBack Then

                c = New Class1()

                Session("instanceClass1") = c

            Else

                c = Session("instanceClass1")

            End If

        End Sub

    2007年4月24日 5:44
    モデレータ
  • ありがとうございます。
    作成したクラスをセッションに保存することで動作させることが出来ました。
    2007年5月21日 4:14