6

C#ASP.Netプログラムに、ポストバック中に入力されるオブジェクトの配列があり、次のポストバック中にそれらを回復したいと考えています。この目的のために、次のように保存されるデフォルトのクラス定義に配列宣言を含めます。-

this.Session["This"] = this;

そして回復した:-

Default saved_stuff = (Default) this.Session["This"];

これは、以下以外のすべてで正常に機能します。-

MyClass [] my_array;

回復すると、saved_stuff.my_array常にnullです。

MyClassは次のように定義されます:-

public MyClass : ISerializable
{
    private string some_string;
    private double some_double;
    // some more simple members
    // Some getters and setters
    // ISerializable Implementation
}

MyClass道具を作ってみましISerializableたが、違いはありません。誰かが私が何をすべきか知っていますか?

@Michaelの質問に答えるために編集してください、私はそれから次のようなことをしています...

for (int i = 0; i <= saved_stuff.my_array.GetUpperBound(0); i++)
{
    // blah blah
}

これは「オブジェクト参照がオブジェクトのインスタンスに設定されていません」で失敗しています。のその他すべてのメンバー変数は、デバッグ時にDefault表示されます。saved_stuff

4

3 に答える 3

7

配列データを独自のセッションオブジェクトに保存する必要があります。

MyClass[] my_array = //Something

Session["ArrayData"] = my_array;

次に、次のように取得します。

var arrayData = (MyClass[])Session["ArrayData"];
于 2012-12-14T15:58:12.547 に答える
3

MSDNによると、セッション状態をメモリ(デフォルト)に保存している場合は、シリアル化可能である必要はありません。

InProc以外のセッション状態モードを使用する場合、セッション変数タイプはプリミティブ.NETタイプまたはシリアライズ可能である必要があります。これは、セッション変数の値が外部データストアに保存されているためです。

他の何かがアレイをクリアしているのではないかと思います。それを覚えておいてください

this.Session["This"] = this;

インメモリセッション状態を使用すると、ページオブジェクトのコピーが作成されないため、ページオブジェクト( " this")に加えた変更は、"保存された"オブジェクトにも行われます。したがって、設定this._saved_stuff = nullすると、保存されたオブジェクトのプロパティもnullになります。

ページをセッションに保存しようとはせず、保存する値を選択して明示的に保存します。

さらに、次のポストバックで値を回復可能にする場合は、代わりに選択することをお勧めしますViewState。を使用Sessionすると、ポストバック間でセッションが破棄されるリスクがあります。まれかもしれませんが、それは考慮事項です。

于 2012-12-14T15:40:55.193 に答える
1

まず、Asp.net Webアプリケーションには、3つのタイプのセッション状態があることを知っておく必要があります。1。処理中2.状態サーバー3.データベース内

セッション状態が進行中の場合(デフォルト)、またはオブジェクトをシリアル化可能としてマークする必要がある場合は、オブジェクトをセッションに直接保存できます。これにより、オブジェクトを状態サーバーまたはデータベース(で設定)に保存できます。設定ファイル)

于 2012-12-14T15:42:30.603 に答える