2011-09-13 44 views
1

私はGridViewでASP.netページを作成しています。 ViewStateが非常に大きいという問題があります。ViewStateが非常に大きい場合、なぜ私のデバッガからViewState.Count = 0になるのですか?

私は、ViewStateに少ないデータを入れるようにGridViewを設定する方法を理解したいと思いますが、最初の問題はViewStateの内容を見ることができないことです。

私はページコード(Page_Loadとgridview_PageIndexChangingを含む)のさまざまなポイントにブレークポイントを配置しようとしました。各ブレークポイントで、私はViewState.Countが0であることがわかります。

実際、私のViewStateが実際には非常に大きいと思われるのはなぜですか?

+0

私はあなたがポストバック後にViewStateをチェックしたと仮定しています。 –

+0

GridViewで 'EnableViewState'をfalseに設定しようとしましたが、ViewStateのサイズにどのような影響を与えていますか? –

答えて

2

asp.netでは、各コントロールは独自のビューステートを保持します。ページイベント内でViewState.Countをチェックするときは、ページのビューステートプロパティの状態バッグをチェックしています。

ページクラスにViewState["test"] = valueなどのプロパティがある場合は、その数が表示されます。グリッドビューのビューステートをページクラスから見ることはできません。 viewstateにプロパティが追加されていないため、ビューステート数はページ上で空です。

しかし、ブラウザがページをレンダリングすると、ページとそのコントロールのすべてのビューステート情報がviewstateの隠し変数に入れられます。

viewstateにグリッドビューのデータを少なくするには、ページングを行う必要があります。そのページングされた場合、グリッドビューは最小限に抑える必要があります可視の行のviewstateを配置します。グリッドビューのviewstateを完全に無効にする場合は、gridviewコントロールでenableviewstate="false"またはviewstatemode (.net 4.0)を、ポストバックを含むすべてのページのロード時にdatabindを実行できます。

+0

この特定のケースでは、GridViewにページインデックスとページサイズを記憶させるだけです。私はどのような状況でも、RowCommandsのグリッドビュー全体の内容をポストバックしたくありません。 –

+0

グリッドビューのページサイズはどのくらいですか?一度にたくさんの行を表示しない場合、あなたはあまりにも多くの列を持っていない限りviewstateはあまりにも大きくなりません。あなたがコマンドアクションのためのボタンを持っているなら、あなたがポストバックしたくない場合、あなたはそれらからajaxコールを持つことができるかもしれません。あなたが何をしようとしているか分かりません。グリッドビューは表示しようとしているデータを元に戻さなければなりません。それをviewstaeに格納しない場合は、すべてのポストバックにバインドする必要があります。ポストバックを避けるためには、jquery/ajaxやコールバックメソッドを試してみる必要があります。 –

関連する問題