/// <summary> /// TotalRecords available /// </summary> public int TotalRecords { get { // ポストバックの間、データを参照する無駄を省くため // 存在するレコード総数をViewStateに詰め込む if (ViewState["totalRecords"] == null) return defaultTotalRecords; // 0 return Convert.ToInt32( ViewState["totalRecords"]. ToString()); } set { // ページに収まりきるサイズが変更された場合 // ページの総数を再計算する TotalPages = CalculateTotalPages( value, PageSize); // ViewStateに設定する ViewState["totalRecords"] = value; } } |
ViewStateには欠点がある。それは、生成されるページの合計サイズが大きくなってしまうという点だ。ページの合計サイズは、ページ単位で生成されたユーザーインタフェースに影響するのではなく、ページ内でどれだけビューステートが使われるかに依存し、HTML容量が劇的に増加していく。筆者は、ページやコントロールがViewStateを必要としないならば、ビューステートを無効にすることを推奨する。
なお、ビューステートを無効にするには、ページで「<%@ Page EnableViewState="false" %>」を使うか、コントロールにおいて、「Page.EnableViewState="false"」とサーバコントロールで指定すればよい。
次の実例は、BookData.xmlというXMLドキュメントを読み込んだDataSetをDataGridサーバーコントロールにデータバインディングすると、それがBase64化され、XMLの属性値になってしまうというものだ。
<%@ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <script runat="server"> public void Page_Load ( Object sender, EventArgs e) { // データを読み込む DataSet ds = new DataSet(); ds.ReadXml(Server.MapPath("BookData.xml")); // DataGridにデータバインディングする DataGrid1.DataSource = ds; DataGrid1.DataBind(); } </script> <form runat="server"> <asp:Button runat="server" Text="PostBack" /> </form> <asp:DataGrid id="DataGrid1" runat="server" /> |
このページをリクエストした時のHTMLソースを見ると、__VIEWSTATEの値は次のようになる。
<input type="hidden" name="__VIEWSTATE" value="dDwxMzg3MzYyMzg7dDw7bDxpPDI+Oz47bDx0PEAwPHA 8cDxsPERhdGFLZXlzO18hSXRlbUNvdW5(〜30行分割愛〜) z47dDxwPHA8bDxUZXh0Oz47bDxQYXJpczs+Pjs+Ozs+ O3Q8cDxwPGw8VGV4dDs+O2w8Jm5ic3BcOzs+Pjs+O zs+O3Q8cDxwPGw8VGV4dDs+O2w8RnJhbmNlOz4+Oz47Oz47Pj4 7Pj47Pj47Pj47Phd0PzYb9Lz7N2ZqMReiGAMMnwyz" /> |
この例ではビューステートの機能を利用していないため、DataGridコントロールのEnableViewState属性を無効にすべきだ。
<asp:DataGrid id="DataGrid1" runat="server" EnableViewState="false" /> |
すると、ページがリクエストされたとき、__VIEWSTATEに含まれる値は、次のようにほどよい大きさになる。
<input type="hidden" name="__VIEWSTATE" value="dDwxMzg3MzYyMzg7Oz6TQ21xg8KTWseIQ341mOOdKXg uIw==" /> |
ビューステートは、ポストバックを用いるページの状態を管理する強力なテクニックだ。しかしビューステートは、ページ出力のサイズを容易に増加させてしまう代償もあるという点を忘れないでほしい。
© Copyright 2001-2005 Fawcette Technical Publications