vb.netを使用してASP.netページ間でデータを渡す

私は私の最初の asp.netアプリケーションを作成しており、PreviousPageプロパティを使用してページ間のデータにアクセスしようとしています。 Visual 2010は私には理解できないエラーを与えているので、私が間違っていることを理解するためには何か助けが必要です。

私は転送を使用してすべてのページ間でバウンスするアプリケーションを持っています。そうすれば、ユーザーの観点から見ると、彼が見るURLは1つだけです。このURLは、彼がアプリケーション(今のところアプリケーション制御機能)にログインし、データベースに接続するURLになります。したがって、私は、次のページに渡すことを望むsqlclient.sqlconnectionオブジェクトを持っています_dbConnectionこれは私のページクラスのプライベート変数です宣言...

   Partial Class Protocol
        Inherits System.Web.UI.Page
        Private _dbconnection As SqlClient.SqlConnection
        Public ReadOnly Property dbConnection As SqlClient.SqlConnection
            Get
                Return _dbConnection
            End Get
        End Property
        ...

コードの後に​​、ボタンのクリックイベントに応答して

Server.Transfer("PSetup.aspx")

PSetup.aspxには以下のものがあります

<%@ Page Title="" Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="True" CodeFile="PSetup.aspx.vb" Inherits="PSetup" %>
<%@ PreviousPageType VirtualPath="~/Protocol.aspx" %>

プロトコルクラスを前のページとして宣言する必要があります

しかし、PSetupのPage_Load Subではこれを試みます

_dbConnection = PreviousPage.dbConnection

この場合、_dbConnectionは新しいページクラスのプライベート変数です。

Visual Studioでエラーが発生しています 'dbConnection'は 'System.Web.UI.Page'のメンバーではありません

私はこれについて何度もドキュメントを読んできましたが、私が間違っていることは分かりません。誰かが私を助けてくれますか?

1

2 答え

共有としてdbConnection変数を作成しようとする

Partial Class Protocol
    Inherits System.Web.UI.Page
    Private Shared _dbconnection As SqlClient.SqlConnection
    Public Shared ReadOnly Property dbConnection As SqlClient.SqlConnection
        Get
            Return _dbConnection
        End Get
    End Property

しかし、私はそれがページ間でデータをやりとりするのがよいのかどうかはわかりません

0
追加された
クエリーストリングやセッションを通してデータを渡すのはなぜですか?
追加された 著者 CoffeeCode,
Microsoftの例では共有はしません - msdn.microsoft.com/en-us /library/ms178139.aspx 。私は共有が危険だと心配しました - ページの異なるユーザーがすべて同じ接続を共有しているということを共有しませんか? (この場合は重要ではないかもしれませんが、私は間違いなくページ間を渡したいと思うユーザ一人一人の価値があります - これはちょうど最初の例でした - 同様の方法で行ったWindowsフォームアプリケーションを移植しています)
追加された 著者 akc42,

最初に理解する必要があるのは、ASP.NETがステートレスであることです。つまり、データはページ間に「保存」されません。 PreviousPage プロパティは、 Transfer メソッドを使用してリクエスト情報を永続させることができ、リクエスト情報はGETまたはPOST変数になります。

IMHOは、あなたが望むことを実行する最良の方法は、どちらのページにも関連しない共有のパブリッククラスを持ち、 SqlConnection を取得するためのパブリック関数を持つことです。ただし、ステートレスなので、毎回接続を作成する必要があります。

別の方法として、セッションにdbConnectionを保存する方法があります(これはセッション情報を表示することができるので推奨しません)。

それ以外の場合は、ページ間の情報で変数を保持することはできません。それはステートレスであることを意味します。

また、 PreviousPage では、 Protocol のインスタンスではなく、 System.Web.UI.Page のインスタンスを作成していることに注意してください。つまり、公開プロパティは Protocol から存在しないので、 Page のネイティブ機能のみが存在します。

編集

From msdn

注意

主にクロスページポストの値を公開するために作成されるソースページのプロパティは、通常読み取り専用のプロパティです。ソースページにはパブリックの読み取り/書き込みプロパティを含めることができますが、ターゲットページプロパティからソースページプロパティを設定することは、値が保持されないため、一般的に意味がありません。

0
追加された
このページは、ViewStateに格納されているため、コントロールの状態を記憶しています。私はあなたのケースでは、セッションでsqlConnectionを保存することができると思いますが、それを行うには良い練習ではありません。
追加された 著者 CoffeeCode,
私の(主に)linux/apache/phpのバックグラウンドから、私はステートレスを理解しています。しかし、asp.netは確かにページオブジェクトがリクエスト間に存在するという印象を与えます。ページクラスの(インスタンスの)プライベート変数はすべて、状態を維持しているように見えますが、クライアントとの間の往復はページ。 Microsoftの例では、PreviousPageが実際のページに強く入力されたことを話し、続いて「CurrentCity」の例を取得することができるプロパティとして示します。私の見ていないことは、私の例がどう違うかです。
追加された 著者 akc42,
私はすべてのページの接続文字列から接続を再作成すると思います - 私は必要な他のもののためのセッション変数を使用することができます(ちょうどいくつかの整数と文字列があります)。あなたの助けてくれてありがとう(両方とも)
追加された 著者 akc42,
これまでの記述に加えて、ちょっとしたゴチチャがあります。いくつかのソースを持つ可能性のあるページでは、@ PreviousPageTypeディレクティブを使用することはできません。だから私は、隠された入力フィールドを作成し、PreviousPage.FindControl( "id-of-hidden-field")でそれらにアクセスすることを考えました。これはMasterPagesのために機能しませんでした。代わりにfindcontrolを使用してContentPlaceHolderを取得し、次にContentPlaceHolderでFindControlを使用してフィールドを取得する必要があります。
追加された 著者 akc42,
ねえ、間違いなく私の間違いです! <%@ PreviousPageType VirtualPath = "〜/ SourcePage.aspx"%> が追加されると(強く入力された場合)、そうでなければPage.PreviousPageプロパティは、Pageとしてタイプされます)。しかし、私はその例を見つけました。これは、 CurrentCity が要求情報を通じて保持されるテキストボックスの値を返すパブリックプロパティであるために機能します。たとえば、前のページのページロードで設定されている任意の文字列を返しません。
追加された 著者 Andrew Jackman,