0

データベースを使用してページ情報を格納し、.NET(C#)を使用してページを構築することで、動的にページを構築しています。そのプロセスの一部は、データベースの内容に基づいてマスターページを(コードビハインドで)設定することであり、私が理解しているように、それはで行う必要がありPage_PreInitます。

私の問題は、オブジェクトと変数をからに渡す方法Page_PreInitですPage_Load

私はそれを次のように機能させることができましたが、この方法を使用するとランダムなコンパイルエラーが発生します:

public partial class BuildPage : System.Web.UI.Page
{
    protected static string pageData;

    protected void Page_PreInit(object sender, EventArgs e)
    {
        --- SET pageData = DATA FROM DATABASE, AND SET MASTERPAGE ---
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        --- USE pageData TO BUILD AND DISPLAY THE REST OF THE PAGE ---
    }
}

さまざまな理由から、私はVisual Studioを使用してページをコンパイルしていません。最初のページの要求で、.NETをオンザフライでコンパイルするだけです。2つのエラーメッセージが表示されます。

1)「CS0102:タイプ「BuildPage」にはすでに「pageData」の定義が含まれています」

2)「ASPNET:このコードファイルで定義されたクラスが「inherits」属性と一致し、正しい基本クラス(PageやUserControlなど)を拡張していることを確認してください。」

奇妙なことに、ページが最初のWebリクエストでコンパイルされることがあります。また、最初のリクエストに含まれない場合は、ランダムな数のページが更新された後、完全にコンパイルされます。コンパイル後、コードビハインドに別の変更を加えて再コンパイルするまで、すべてが正常に機能しているように見えます。

Page_PreInitそのメソッドを使用してとの間で変数を共有する場合にのみ、これらのコンパイルエラーが発生するようですPage_Load。つまり、データベースからデータを2回要求した場合、1回は「Page_PreInit」で、もう1回は「Page_Load」でこれらのエラーが発生することはありません。しかし、私は実際にはデータベースの負荷を2倍にしたくありません。

だから私の質問は本当に2つの部分に分かれています、最初に、変数を共有するための許容できる方法ですか、それともからPage_PreInitにデータを渡すためのより良い方法がありPage_Loadますか?

そして第二に、それが許容できる方法である場合、エラーは無関係であり、以前にWebリクエストを繰り返した後に単に消える同様のエラーを見た人はいますか?

助けてくれてありがとう!飼料

4

4 に答える 4

0

ほとんどの場合、メンバー変数を静的にしたくないでしょう。複数の人が同時にページにアクセスしている場合、奇妙な結果が生じる可能性があります。
テンプレートの動作方法が原因で、問題の直接的な原因である可能性もありますが、それは確かではありません。

于 2009-07-23T18:49:51.560 に答える
0

保護された(またはプライベートな)メンバーを使用することは、クラス内のメソッド間でオブジェクトを共有するための正しい方法です。ただし、メンバーはであってはなりませstaticStatic複数のスレッドにまたがる単一のインスタンスがあることを意味します。そのページにアクセスするさまざまな要求に対して実行されているページのすべてのコピーは、そのメンバーの読み取り/書き込みを競合しています。

また、クラスは「部分的」とマークされています。つまり、同じBuildPageクラスの追加のメンバーとメソッドを持つ別のファイルに別のクラスフラグメントが存在する可能性があります。両方で同じメンバーを宣言するとpageData、競合します。

于 2009-07-23T18:49:52.340 に答える
0

コードビハインドに、BuildPageとして指定されたクラスを持つ複数のページがありますか?これらはページごとに一意であり、関連する.aspxのページディレクティブで適切に参照されている必要があります。CS0102エラーは、同じ名前の2つの部分クラスがあり、どちらも静的な値を定義していることが原因だと思います。したがって、2つのパーシャルが結合されると、結合されたクラスで静的を2回定義しようとします。クラス名/ページディレクティブを整理すると、2番目のエラーも解決するはずです。

次に、pageData変数が静的である理由はありません。静的でなくても、値を設定してアクセスできます。

于 2009-07-23T18:50:02.590 に答える
0

静的はあなたが望むものではありません-それはページのすべてのインスタンスによって共有されるので、2つのクライアントが同じページをロードしている場合、2番目は最初のページを上書きし、初期化とロードの間にそれを行う可能性があります最初。

ページのHttpContextを使用してデータを渡すことができ、すべてのイベントを通過します。

于 2009-07-23T18:53:30.727 に答える