2012-02-15 9 views
6

私はASP.NET MVC 3を使用していますが、私は要求間で維持する必要があるC#オブジェクトを持っています。これは、この質問にとって本当に重要ではないサーバー側の状態情報を維持します。現在、このオブジェクトはセッションに直列化され、各要求時に引き出されます。MVC 3の状態の永続性のためにビューにオブジェクトを格納する最も良い方法は?

このアプローチの問題は、オブジェクトがセッション固有のものであることですが、各リクエストに固有のものにしたいと思います。したがって、ブラウザで2番目のタブを開くことは、同じセッションであるため、最初のタブと同じオブジェクトを共有するのではなく、基本的に独自のオブジェクトを持つことになります。

明らかに、私はこのオブジェクトをページに保存し、要求を返して戻す必要があります。私はこれについて最善の方法が何であるか考えている。クライアントはこのオブジェクトの情報を必要とせず、このオブジェクトのデータは機密データではないため、訪問者が閲覧することを防止しようとはしていません。私は単に、要求の間にこのオブジェクトを格納する最良の方法が何であるか不思議に思っています。 C#オブジェクトをビューに直列化する単純な方法はありますか?たとえば、隠しフィールド(Webフォームビューステートに似ています)のようにして、それぞれの要求を取り戻すのですか?

+0

単に 'Html.Hidden'や' Html.HiddenFor'を使わない理由はありますか? –

+0

私はC#オブジェクトをシリアル化する必要があるので。私が隠しフィールドで行った場合、オブジェクトをビューステートスタイルのストレージに集中して次の要求でシリアル化するのではなく、オブジェクトのすべてのプロパティに対して非表示のフィールドを持たなければなりません。 – Chev

+0

ああ、私はそれを逃した。それははるかに理にかなっています。申し訳ありません:) –

答えて

3

FuturesプロジェクトのHtml.Serializeを使用できます。あなたはInstall-Package Mvc3Futuresで入手できます。

+1

これは本当に固いソリューションのようです。私はそれを試して、報告する。ありがとう! – Chev

+0

私に教えてください、アレックス。私はおそらくそれを使うだろう。 –

+1

これは素晴らしい結果を出しました。申し訳ありませんが更新にはとても時間がかかりました。使い方が簡単です。強くお勧めします。また、これは先物プロジェクトではなく私が考えるMVCの一部でなければなりません。これは、ウィザードなどの作成に非常に便利です。 – Chev

1

私はFacebookのBigPipeをc#で実装しました。リクエスト間に個々のオブジェクトを格納するためにHttpContextBase Itemsコレクションを使用しました。

var someCollection = (List<T>)ViewContext.HttpContext.Items["SomeCollection"];  
1

そこで、別の解決策 - この問題を回避するにもかかわらずは、 - セッション状態の一部として、キーと値のペア内のオブジェクトを格納し、隠しフィールドとしてキーを記憶することであろう。

  1. thingToStore = new KeyValuePair<string, YourType>("key1", yourObject)
  2. セッション状態に追加します。
  3. ユーザーのフォームでキーを非表示にします。
  4. ポストバック/アクション呼び出し時にキーを取得する
  5. キーでオブジェクトを取得します。あなたはあなたが提供するキー・ジェネレータに基づいてオブジェクトの永続性のタイプを、注入できるよう

キーは、ごとに一意である可能性があります。

それは、とにかくそれを行う方法の1つです。

+0

これは、実際にはすばやく修正するための実際のアイデアです。 – Chev

関連する問題