2009-03-25 13 views
0

これはちょっと抽象ですが、ここにあります:サイトをグローバルにするにはどうすればよいですか?

私はウェブサイトを作成していて、サイトのどのページからでもアクセスできるフィールド "foo"を持っています。これを行う最善の方法は、 "bar"というページのサブクラスを作成し、保護されたフィールド "foo"を追加し、 "bar"からすべてのWebページを取得することだと考えました。タダ。すべてのページにfooが追加されました。

しかし、私は自分のページにコントロールを追加して、 "foo"にアクセスできるようにします。

さて、fooは保護されないので、公開されています。ファイン。しかし、コントロールは "foo"についてどのように知っていますか?

Foo foo = ((Bar)Page).foo; 

これは機能しますが、私は少し醜いと思います。私は本当にfooを使えるようにしたいと思っています。私は、ちょっと、私がページのためにやったコントロールで同じトリックをすることができるかもしれないと考えています。私はUserControlから継承する新しいクラス "blargh"を作成し、そこで醜い方法でfooを取得します。それから、私のコントロールはぼんやりしています。わーい!

それ以外は機能しません。私がプロジェクトを立ち上げると、ページがヌルなので、アクセスしようとしている行((Bar)Page).fooに不満があります。どうして? Pageはnullになる可能性がありますか?コールスタックを見ると、何の助けも得られません。

これを行うには簡単に、よく理解された方法がありますか?私は間違った木を吠えますか?

+0

誰かがこの質問を投票しましたか?理由を知ることに興味があるので、可能であれば修正することができます。 – Beska

答えて

2

アクセスを必要とするオブジェクトとアクセスできないオブジェクトを決定する前に、これを開始するもう1つの簡単な方法は、これと他のグローバルオブジェクトを保持するパブリック静的クラスを作成することです。次のようなもの:

public static class Globals 
{ 
    public static Foo foo = new Foo(); 
} 
+0

私はこのルートにも出発しました。私はそれが好ましい方法だと聞いてきました。私はここで素晴らしい要約を見つけました:http://dotnetperls.com/Content/Global-Variables-ASPNET.aspx –

+0

この回答は、私が合理的に願うことができる私の不明な質問への明確な答えについてです。 – Beska

2

すべてのユーザーが独自のインスタンスを持つ必要がある場合は、セッションに保存できます。

Session["foo"]=data; 

次に、あなたが使用することができ、あなたの他のページ:

Control ctl = (Control) Session["foo"]; 

を覚えておいてください、あなたがで動作するように好きなタイプにセッション[「foo」を]キャストする必要があります。同様のApplication []スペースもあります。このスペースは、Webサイトのすべてのユーザーに1つのインスタンスしか必要ない場合に使用できます。

1

何が必要ですか?データがあれば、Sessionにfooの値を入れてみませんか?それから、どこからでもアクセスできます。

1

fooはグローバルに共有される同じ値ですか、それともページごとに異なるのですか?

私はあなたが好きかもしれない二つの可能性を参照してください。(それはasp.netでハング場所を正確に私は覚えていないが、その名前を持つことができますASP.NetのApplicationオブジェクトにそれを入れて

  1. をそれについてのdocを見つける)。これは変化しないグローバル値のためです。

  2. Controlの拡張メソッドにします。ページは最終的にコントロールから継承されるため、利用可能になります。このように:

    public static class ControlExtensions 
    { 
        public static Foo foo(this Control self) 
        { 
         return foo; 
        } 
    } 
    

今のUserControlとページがそれを取得することができるはずです。見て

1

1つのオプションは、ページのインスタンスがあるたびに、そのページが利用できるのFooを持っていますextension methods

を使用して、ページクラスを拡張することです。 Fooが何をしているかによって、おそらくまだセッションにデータを保存する必要があります。

理由として、あなたのコントロールではページが利用できません。 Pageプロパティは、コントロールがページに追加された後にのみ設定されます。あなたのコントロールがページに直接座っていない場合は、そのページに座っているanscetorがページに追加されます。

1

この[foo]がすべてのユーザーで同じになるのか、それとも単一のユーザーに固有ののかを判断する必要があります。すべてが同じであれば、静的変数を持つStaticクラスがこれを解決します。

ユーザーごとに特定のものを探している場合は、セッションを使用してこれを保存することをおすすめします。 FooClassをセッションに入れることもできます。実際にあなたが置いているものについてはあなたのことを考えています。

FooClass myFoo = Session["CurrentFoo"] as FooClass; 
関連する問題