コントロールでViewStateが「本当に」有効かどうかを確かめる
はじめに
本エントリでは、ASP.NETで、ページに配置したあるコントロールについて、そのコントロールでViewStateが有効かどうか(コードビハインドでのプロパティ値変更が、次回以降のポストバック時に保存されているか)を調べる方法を述べる。
EnableViewState?
そのコントロールでViewStateが有効かどうかを調べるには、EnableViewStateというプロパティがある。しかし、このプロパティでは、「本当に」そのコントロールのViewStateが有効かどうかを調べることはできない。その理由は、IsViewStateEnabledプロパティの解説に記述されている。
IsViewStateEnabledプロパティの解説の意味
IsViewStateEnabledプロパティは、あるコントロールで呼び出された場合、そのコントロールのEnableViewStateプロパティ値、そのコンテナ(コントロールツリーの親ノード)のEnableViewStateプロパティ値、そのまたコンテナの…と辿り、ページに辿り着くまでに(ページを含め)1つでもfalseであればfalseを返す。ページに辿り着くまでの全てのコンテナでtrueであれば、trueを返す。
実は、「本当に」コントロールのViewStateが有効かどうかは、このプロパティ値でしか知ることができない。このプロパティ値がtrueの場合に、「本当に」コントロールのViewStateが有効である。
protectedって…
しかし、ここで一つ問題がある。IsViewStateEnabledプロパティのアクセス修飾子がprotected internalなのだ。つまりこのプロパティは、コントロールから派生した自作コントロールを作成する際にしか使うことができない*1。
自作しておく
そんなわけで、コントロールの外から、そのコントロールで「本当に」ViewStateが有効かどうかを調べる方法は、ASP.NETの標準APIでは提供されていないはずだ。しかし、この程度の処理であれば簡単に自作できる。以下にコードを示しておく。
public static Boolean isViewStateEnabled(Control control) { if (control == null) { throw new ArgumentNullException("control"); } for (Control c = control; c != null; c = c.Parent) { if (!c.EnableViewState) { return false; } } return true; }
*1:protectedでなくprotected internalなので、この表現は厳密には正確でないが