2012-04-16 20 views
0

PostBack中にViewBag関数のポインタ値が失われるという問題があります。ポストバック後にViewBag値を保持する

私のサイトは、私がViewBag関数ポインタを利用して、私の顧客の状況を示すバナー(部分図)を持つ:

ViewBag.CustomerStatus= new Func<id, string>(GetCustomerStatus); 

(idは私の顧客のIDで、それは、ステータスを返される文字列を返した場合は)

私がバナー部分ビューを利用する他のページに行くとき、私はCustomerStatus ViewBag変数を失います。私はViewBagsが「ページごとに」のみ利用可能であることを知っていますが、冗長ではなく、繰り返すことなく、アプリケーション内の他の場所から顧客ステータス機能を利用できるようにするにはどうすればいいですか?ViewBag.CustomerStatus = new Func(GetCustomerStatus);すべての単一のActionMethod呼び出しで?

Session/ViewStateに関数ポインタを格納することはできますか?安全 ? ポストバック間で最新の顧客ステータスにアクセスするにはどうすればよいですか?

ありがとうございます。

答えて

1

私は

代わりの直接部分図をレンダリング...以下のアプローチを取ってしまったそれは、コントローラのアクションメソッドを介して呼ばれていますので、私はそれを変更しました。

は、私が作成した:だから

public PartialViewResult CustomerStatus() 
{ 
    ...here I called my private GetCustomerStatus methods 
    ViewBag.CustomerStatus = GetCustomerStatus(); 
    Return PartialView(" 
} 

ではなくヘッダー・バナーをレンダリングする必要がある時はいつでも、別途ViewBag関数ポインタを呼び出すのではなく、@ Html.Partial(「BannerPartialView」)私は私の@htmlを呼ぶの同じバナーを返すが、顧客ステータス変数を使用できる.Action(CustomerStatus)メソッド。

紛らわしいことではなく、他人に役立つことを願っています。

3

構造的に言えば、私に間違ったやりかたをさせるものがあります。ビューに関数呼び出しを渡すべきではありません。データを渡す必要があります。あなたのアプローチは、MVCによって提唱された「懸念の分離」に違反しています。

表示するデータを表すビューモデルを作成し、関数を呼び出す(モデル内から、または必要ならコントローラから)ことをお勧めします。その後、モデルをビューに渡して、ビューでデータを表示する方法を心配してください。

すべての呼び出しで繰り返しデータがある場合は、OnActionExecutingメソッドをオーバーライドしてモデルに追加し、その時点でモデル(またはViewBag)に値を追加できます。

+0

ええ、あなたは間違いありません。 ViewBagの関数ポインタはレイヤー分離ロジック全体を壊しますが、このプロジェクトにはすでにこのViewBagコントローラの関数ポインタが実装されているため、すべての場所に実装されているため、フローに入ります。 とにかく...バナーパーツビューには既にデータを取り込むモデルがあります。私は自分の新しいモデルと交換することはできないと思う。私はビューにセカンダリモデルを渡す方法はないと思いますか? セッションポインタが最善の方法であるにもかかわらず、それは私の理由です。あなたの考えは? – Shenaniganz

+0

次に、関数ポインタから戻ってきた値をViewBagに埋め込むのが最善の策でしょうか? – mgnoonan

関連する問題