GridView执行RenderControl产生的错误

  GridView 控件常有需要汇出 Excel 的需求,一般都是将 GridView 使用 RenderControl 来输出其 HTML 程序代码。本文即在讨论 RenderControl 所产生的问题及解决方式,不过本文是透过 BasePage 的方式,让 RenderControl 的相关处理动作更简化。

手动解决 RenderControl 所产生的问题
  下面的 ControlToHTML 函式,主要是将控件转换为对应的 HTML 程序代码。

   /**/''' <summary>
    ''' 将控件转换为对应的 HTML 程序代码。
    ''' </summary>
    ''' <param name="Control">控件。</param>
    Public Shared Function ControlToHTML()Function ControlToHTML(ByVal Control As System.Web.UI.Control) As String
        Dim sHTML As String = String.Empty
        Dim oTextWriter As New System.IO.StringWriter()
        Dim oHTMLWriter As New System.Web.UI.HtmlTextWriter(oTextWriter)

       Control.RenderControl(oHTMLWriter)
        sHTML = oTextWriter.ToString()
        Return sHTML
    End Function

  你可以整个 GridView 控件传入 ControlToHTML 来取得它的 HTML 程序代码,不过当执行此方法时,会遇到由 Page.VerifyRenderingInServerForm 方法释出的错误讯息。
当执行下面的程序代码时

Dim sHTML As String = ControlToHTML(GridView1)

会产生错误讯息

型别 'GridView' 的控件 'GridView1' 必须置于有 runat=server 的窗体标记之中。

  要解决这个问题就是让 Page 不要执行 VerifyRenderingInServerForm 方法,所以 Page 要覆写 VerifyRenderingInServerForm 方法,而不做任何事。

Public Overrides Sub VerifyRenderingInServerForm()Sub VerifyRenderingInServerForm(ByVal Control As System.Web.UI.Control)
     '覆写,不执行 MyBase.VerifyRenderingInServerForm 方法,解决执行 RenderControl 产生的错误
End Sub

  接下来继续执行程序,若 GridView 有 CommandFIeld 或分页时,它会去做事件验证的动作,而会引发另一个错误讯息

RegisterForEventValidation 只能在 Render(); 期间呼叫

  要解决这个问题,可以切换到 aspx 程序代码中,在 <%@ Page %> 中加入 EnableEventValidation="false" 即可。

<%@ Page Language="VB" AutoEventWireup="false" EnableEventValidation="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

 
使用 BasePage 解决 RenderControl 所产生的问题
  虽然上述的方式可以解决 RenderControl 产生的问题,可是似乎有点太麻烦,有没有更简单的方式呢?我们用 BasePage 来处理这个问题,不用当有这类需求时还要去手动故这些设定。
  TBBasePage 继承 Page,新增一个 IsVerifyRender 属性(预设为 True),来决定是否执行 MyBase.VerifyRenderingInServerForm 方法。

  首先覆写 VerifyRenderingInServerForm 方法,当 IsVerifyRender="False" 时,不会去执行 MyBase.VerifyRenderingInServerForm 方法;

  另外覆写 EnableEventValidation 方法,当 IsVerifyRender="False" 则传回 False。当我们要用 RenderControl 来输出控件的 HTML 码时,只需先设定 IsVerifyRender = "False" 即可。

/**/''' <summary>
''' 页面基础类别。
''' </summary>
Public Class TBBasePageClass TBBasePage
    Inherits System.Web.UI.Page

    Private FIsVerifyRender As Boolean = True

    /**/''' <summary>
    ''' 是否执行 VerifyRenderingInServerForm 方法。
    ''' </summary>
    Public Property IsVerifyRender()Property IsVerifyRender() As Boolean
        Get
            Return FIsVerifyRender
        End Get
        Set(ByVal value As Boolean)
            FIsVerifyRender = value
        End Set
    End Property

    /**/''' <summary>
    ''' 覆写。
    ''' </summary>
    ''' <param name="Control"></param>
    ''' <remarks></remarks>
    Public Overrides Sub VerifyRenderingInServerForm()Sub VerifyRenderingInServerForm(ByVal Control As System.Web.UI.Control)
        If Me.IsVerifyRender Then
            MyBase.VerifyRenderingInServerForm(Control)
        End If
    End Sub

    /**/''' <summary>
    ''' 覆写。启用事件验证动作。
    ''' </summary>
    Public Overrides Property EnableEventValidation()Property EnableEventValidation() As Boolean
        Get
            If Me.IsVerifyRender Then
                Return MyBase.EnableEventValidation
            Else
                Return False
            End If
        End Get
        Set(ByVal value As Boolean)
            MyBase.EnableEventValidation = value
        End Set
    End Property
End Class

  有了 TBBasePage 的 IsVerifyRender 属性后,我们就可以将上述的 ControlToHTML 函式,改写如下。当 GridView 控件置放在 TBBasePage 时,执行 ControlToHTML 函式时,不需另行设定即能正常执行。

    /**/''' <summary>
    ''' 将控件转换为对应的 HTML 程序代码。
    ''' </summary>
    ''' <param name="Control">控件。</param>
    Public Shared Function ControlToHTML()Function ControlToHTML(ByVal Control As System.Web.UI.Control) As String
        Dim sHTML As String = String.Empty
        Dim oTextWriter As New System.IO.StringWriter()
        Dim oHTMLWriter As New System.Web.UI.HtmlTextWriter(oTextWriter)

        If Control.Page IsNot Nothing Then
            If TypeOf Control.Page Is TBBasePage Then
                DirectCast(Control.Page, TBActionPage).IsVerifyRender = False
            End If
        End If

        Control.RenderControl(oHTMLWriter)
        sHTML = oTextWriter.ToString()
        Return sHTML
    End Function

来源:http://www.cnblogs.com/jeff377/archive/2008/05/17/1201192.html

加支付宝好友偷能量挖...


评论(0)网络
阅读(101)喜欢(0)Asp.Net/C#/WCF