2009-08-22 10 views
0

現時点では、ASP.NET ViewPageのOnLoadイベントをオーバーライドしています。オブジェクトをすべてのビューページで共有できるようにします。しかし、私は現在、コントローラ内のそのオブジェクトにアクセスできる必要があります。そうする最善の方法は何ですか?コントローラとビューページの間でオブジェクトを共有するには?

本質的に、私はビューページとコントローラでオブジェクト(Webアプリケーションの各ユーザーに固有の...シングルトンが存在する)を共有したいと思います。

ありがとうございます!

答えて

1

ユーザーのセッション全体に対するオブジェクトへの参照を維持することを望んでいるのか、単一の要求に対してのみオブジェクトを参照したいのかわかりません。いずれかの方法で、あなたは、コントローラとビューを使用するためのスコープにオブジェクトを取得するためのGlobal.asaxを使用することができます。

Global.asax.cs:

まず、要求は、オブジェクトをスコープ

protected void Application_BeginRequest(object sender, EventArgs e) { var myObject = SomeMethodThatGetsMyObject(); HttpContext.Current.Items.Add("MyObjectKey", myObject); } protected void Application_EndRequest(object sender, EventArgs e) { HttpContext.Current.Items.Remove("MyObjectKey"); } 

は、次にコントローラにそうように、これをアクセスすることができます。

public ViewResult ThisAction() 
{ 
    var myObject = HttpContext.Current.Items["MyObjectKey"] as MyObjectType; 
    // placing this in view data provides easy access in the view. 
    ViewData["MyObject"] = myObject; 
    return View(); 
} 

が次にビューにあなたはViewDataを、またはdirectlからこれをアクセスすることができますHttpContext

<% var myObject = ViewData["MyObject"] as MyObjectType; %> 

<!-- If for some reason you don't want it in view data 
you can use the HttpContext directly instead --> 

<% var myObject = HttpContext.Current.Items["MyObjectKey"] as MyObjectType; %> 

セカンドからyは、セッションオブジェクトをスコープ:

このメソッドは、ユーザーのセッションが終了するまでのスコープ内のオブジェクトを維持します。

Global.asax.cs

protected void Session_Start(object sender, EventArgs e) 
{ 
    var myObject = SomeMethodThatGetsMyObject(); 
    Session["MyObjectKey"] = myObject; 
} 

protected void Session_End(object sender, EventArgs e) 
{ 
    Session.Remove("MyObjectKey"); 
} 

は、次にコントローラにそうように、これをアクセスすることができます。

public ViewResult ThisAction() 
{ 
    var myObject = Session["MyObjectKey"] as MyObjectType; 
    // placing this in view data provides easy access in the view. 
    ViewData["MyObject"] = myObject; 
    return View(); 
} 

を次にビューで、あなたはViewDataをから、または直接のHttpContext

からこれをアクセスすることができます
<% var myObject = ViewData["MyObject"] as MyObjectType; %> 

<!-- If for some reason you don't want it in view data 
you can use the Session directly instead --> 

<% var myObject = Session["MyObjectKey"] as MyObjectType; %> 

ベストプラクティス

このデザインを少し改善するためにいくつかのベストプラクティスを適用することができます。 1つは、ビュー内のオブジェクト全体を渡して使用する代わりに、必要な値をビューデータに渡して、ビューに代入コードとキャストコードを保持させない方がよい場合があります。

また、常に利用可能なユーザースコープのオブジェクトを作成したいという欲求がある場合は、「キャストすることができますか?ちょうど "の場合は、少しの反パターンです。このオブジェクトの目的が何であるかを知ることは有益なので、既知のベストプラクティスに従って問題を解決するのに役立つパターンが示唆される可能性があります。

これのどこかで私が少し助けてくれることを願っています。

0

コントローラーの基本クラスに入れますか?

正直なところ、あなたのデザインには欠陥があると思われます。何らかの「神オブジェクト」があなたのデザインに影響を与えています。あなたがやっていることをより良い方法で尋ねるなら、より良い答えを得るかもしれません...

0

あなたのビューにいくつかのセッション変数を渡したいと思うようです。おそらく、これを達成する最善の方法は、セッションオブジェクトからこれらの情報をロードする基本ビューモデルクラスを作成することです。この基本オブジェクトを使用して、各ビューの調整済みのビューモデルクラスを構築することができます。

+0

私は、これはあなたが意味を正確に何であるかどうかわからないんだけど、この種のものはSessionFacadeです。ここの例:http://www.codeproject.com/KB/aspnet/session_facade.aspx –

0

私はウィルに同意します。主コントローラーが派生する基本コントローラークラスにオブジェクトを貼り付けます。

他人の言うことを参照するにはこちらをご覧>>ViewModel-Best-Practices

関連する問題