動的に作成されたコントロールをホストするカスタムUserControlを使用していますが、ViewState情報が失われているように見える奇妙な状況に遭遇しています。base.SaveViewState()呼び出しでオーバーライドされたSaveViewStateメソッドでは、ViewStateにあったすべてのものを含むオブジェクトが返されると期待しますが、代わりにnullを返します。
protected override object SaveViewState()
{
object[] tempState = new object[2];
tempState[0] = base.SaveViewState(); //***suspected issue here, tempState[0] == null -- why?
//? this.ViewState["CompanyID"] returns me the guid I'm expecting
//... code instantiating and populating lstDataControlInfos
tempState[1] = lstDataControlInfos;
return tempState;
}
そのメソッドにブレークポイントを設定し、イミディエイトウィンドウを使用してViewState ["CompanyID"]をクエリし、ViewStateに実際にCompanyIDが格納されていることを確認できます。たぶん私はViewStateについて何か誤解していますが、その呼び出しはすでにViewStateにあるもの(私のCompanyIDを含む)を返すべきではありませんか?この問題は、オーバーライドされたLoadViewStateメソッドのポストバックで問題になります。これは、CompanyIDをViewStateから取得する方法がなくなったためです。nullに戻ります。
protected override void LoadViewState(object savedState)
{
object[] tempState = (object[])savedState;
//tempState[0] == null, as it was stored in the previous SaveViewState call
//any reference to ViewState["CompanyID"] comes back null
base.LoadViewState(tempState[0]);
}
このコントロール内にViewStateにシリアル化および逆シリアル化する動的コントロールがあると述べましたが、それらはすべて正しく機能しているようです。ファクトを知っていて、SaveViewState呼び出し中にViewStateにデータがあることを(即時ウィンドウを介して)確認できる場合、base.SaveViewState()がnullを返す原因は何ですか?