42

誰かがViewStateとSessionの違いを説明できますか?

具体的には、ページのライフサイクル全体でオブジェクトを利用できるようにする(ポストバックを通じてメンバーを継続的に設定する)ための最良の方法を知りたいです。

私は現在Sessionsを使用してこれを行っていますが、それが最善の方法かどうかはわかりません。

例えば:

SearchObject searchObject;
protected void Page_Load(object sender, EventArgs e)
{
     if(!IsPostBack)
     {
         searchObject = new SearchObject();
         Session["searchObject"] = searchObject;
     }
     else
     {
         searchObject = (SearchObject)Session["searchObject"];
     }
}

これにより、ページの他の場所でsearchObjectを使用できるようになりますが、プロパティなどを変更した場合にセッション変数をリセットする必要があるため、面倒です。

ページが読み込まれるたびに.NETがオブジェクトを再インスタンス化せず、Pageクラスのグローバルスコープに配置するために、これを行うためのより良い方法があるはずだと思いますか?

4

3 に答える 3

63

検索オブジェクトのサイズがそれほど大きくない場合は、ViewStateを使用してください。ViewStateは、オブジェクトを現在のページのライフサイクルの間だけ存続させたい場合に最適です。

セッションオブジェクトも使用できますが、検索オブジェクトがそこにあると、ページのライフサイクルが長くなります。

また、ViewState / Sessionオブジェクトで行うことの1つは、アクセスをプロパティでラップすることです。

public object GetObject
{
    get
    {
        return ViewState["MyObject"];
    }
    set
    {
        ViewState["MyObject"] = value;
    }
}

私はそれをこのようにするほうがきれいだと思う傾向があります。上記のコードをニーズに合わせて変更するだけです。

于 2010-05-21T15:06:52.660 に答える
31

まず、ビューステートはページごとですが、現在のセッション中にアプリケーション全体にセッションが存在するため、検索オブジェクトをページ間で保持する場合は、セッションが適切な方法です。

次に、Viewstateは暗号化されたテキストとしてブラウザとサーバー間でポストバックごとに転送されるため、Viewstateに保存するほど、毎回クライアントとの間でやり取りされるデータが多くなりますが、セッションはサーバー側に保存されます。前後に移動するのは、CookieまたはURLのいずれかとしてのセッション識別子だけです。

セッションまたはビューステートが検索オブジェクトを格納する適切な場所であるかどうかは、検索オブジェクトで何を行っているか、およびその中にどのデータがあるかによって異なります。上記の説明が、使用する適切な方法を決定するのに役立つことを願っています。

于 2010-05-21T15:06:56.223 に答える
2

ビューの状態はページ固有ですが、セッションの状態はブラウザ固有です。ビューステートを介して、あるページから別のページにデータを渡すことはできません。ただし、セッション状態を使用します。各セッションには一意のIDがありますが、ビューステートはページ自体の非表示フィールドにデータを保存します。セッションはサーバー側にデータを保存します。ビューステートデータはページに保存されるため、ページが重くなり、アプリケーションが遅くなります。各コントロールには、デフォルトでその状態(コントロール状態)を格納するビューステートtrueがあります。enableviewstate= falseを作成することで、簡単に有効または無効にできます。

于 2016-06-28T13:34:33.603 に答える