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
加支付宝好友偷能量挖...