atsukanrockのブログ

Microsoft系技術を中心にぼちぼち更新します

コントロールで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なので、この表現は厳密には正確でないが