【ASP.NET】RegisterForEventValidation は Render(); の実行中にのみ呼び出されることができます

前回の続きです。
GridViewを利用したExcelファイル出力の際に、『GridViewのコントロールGridView1は、runat=server を含む form タグの内側に置かなければ成りません』のエラーになってしまう対応の続きです。

前回は、

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    ' このOverridesは以下のエラーを回避するために必要です。
    ' 「GridViewのコントロールGridView1は、runat=server を含む
    '  form タグの内側に置かなければ成りません」    
  End Sub

を入れることで、VerifyRenderingInServerFormをOverridesして、サーバー フォーム要素の表示方法が異なっているページは、異なった条件の下でこのメソッドをオーバーライドして例外をスローしました。
第一関門突破です。

しかし、『RegisterForEventValidation は Render(); の実行中にのみ呼び出されることができます』
が発生するようになりました。
どうやらGridViewの列にButtonFieldやCommandFieldを使用している場合に、PostBackを検証対象処理として登録を行う際にRegisterForEventValidation を呼び出すようで、この中で Render 中かどうかがチェックされてしまうようです。

で、さらにググると、このチェックを行うかどうかは EnableEventValidation プロパティで制御できるようです。

    Public Overrides Property EnableEventValidation() As Boolean
        Get
            ' 「RegisterForEventValidation は Render(); の実行中にのみ呼び出されることができます。」
            ' を出ないようにする
            Return False
        End Get
        Set(ByVal value As Boolean)
        End Set
    End Property

これでエラーが発生せずExcelファイルの出力が可能になりました。
めでたしめでたし^^

ただ、単純にFalseにすると、今回の私のように入力コントロール等があるGridviewの場合、セキュリティ上まずいと思われるので、Excelファイルを作るときのみFalseになるように制御しないといけないと思います。

今回は気になったので調査しました。
以上ASP.NETのシステム開発備忘録でした。