web-dev-qa-db-ja.com

ViewState Vs Session ...ページのライフサイクルを通してオブジェクトを維持する

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

より具体的には、ページのライフサイクル全体を通じてオブジェクトを使用可能に保つ(ポストバックを通じてメンバーを継続的に設定する)最良の方法を知りたいと思います。

私は現在これを行うためにセッションを使用していますが、それが最善の方法であるかどうかはわかりません。

例えば:

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クラスのグローバルスコープにそれを配置するように、これを行うためのより良い方法が必要だと思います。

40
Kyle

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

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

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

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

私はこの方法でそれを行う方がきれいだと思う傾向があります。必要に応じて上記のコードを変更してください。

60
Jason Evans

まず、Viewstateはページごとです。現在のセッション中にアプリケーション全体にセッションが存在するため、searchobjectをページ間で保持したい場合、セッションが正しい方法です。

すべての2番目のViewstateは、各ポストバックでブラウザーとサーバー間で暗号化されたテキストとして転送されるため、Viewstateに格納するほど、セッションがサーバー側に格納されるのに対し、より多くのデータが毎回クライアントに行き来しますそして、行き来する唯一のものは、CookieまたはURL内のセッション識別子です。

セッションまたはビューステートが検索オブジェクトを保存する適切な場所であるかどうかは、それを使って何をしているのか、そしてその中にどんなデータがあるのか​​によって異なります。

28
Ben Robinson

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

1
Bhawesh Deepak