zoukankan      html  css  js  c++  java
  • 使用 BasePage 来解决 GridView 执行 RenderControl 产生的错误

     



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

     1    ''' <summary>
     2    ''' 将控件转换为对应的 HTML 程序代码。
     3    ''' </summary>
     4    ''' <param name="Control">控件。</param>

     5    Public Shared Function ControlToHTML(ByVal Control As System.Web.UI.Control) As String
     6        Dim sHTML As String = String.Empty
     7        Dim oTextWriter As New System.IO.StringWriter()
     8        Dim oHTMLWriter As New System.Web.UI.HtmlTextWriter(oTextWriter)
     9
    10        Control.RenderControl(oHTMLWriter)
    11        sHTML = oTextWriter.ToString()
    12        Return sHTML
    13    End Function

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

    Dim sHTML As String = ControlToHTML(GridView1)

    会产生错误讯息

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


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

    1Public Overrides Sub VerifyRenderingInServerForm(ByVal Control As System.Web.UI.Control)
    2     '覆写,不执行 MyBase.VerifyRenderingInServerForm 方法,解决执行 RenderControl 产生的错误
    3End 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" 即可。

     1''' <summary>
     2''' 页面基础类别。
     3''' </summary>

     4Public Class TBBasePage
     5    Inherits System.Web.UI.Page
     6
     7    Private FIsVerifyRender As Boolean = True
     8
     9    ''' <summary>
    10    ''' 是否执行 VerifyRenderingInServerForm 方法。
    11    ''' </summary>

    12    Public Property IsVerifyRender() As Boolean
    13        Get
    14            Return FIsVerifyRender
    15        End Get
    16        Set(ByVal value As Boolean)
    17            FIsVerifyRender = value
    18        End Set
    19    End Property

    20
    21    ''' <summary>
    22    ''' 覆写。
    23    ''' </summary>
    24    ''' <param name="Control"></param>
    25    ''' <remarks></remarks>

    26    Public Overrides Sub VerifyRenderingInServerForm(ByVal Control As System.Web.UI.Control)
    27        If Me.IsVerifyRender Then
    28            MyBase.VerifyRenderingInServerForm(Control)
    29        End If
    30    End Sub

    31
    32    ''' <summary>
    33    ''' 覆写。启用事件验证动作。
    34    ''' </summary>

    35    Public Overrides Property EnableEventValidation() As Boolean
    36        Get
    37            If Me.IsVerifyRender Then
    38                Return MyBase.EnableEventValidation
    39            Else
    40                Return False
    41            End If
    42        End Get
    43        Set(ByVal value As Boolean)
    44            MyBase.EnableEventValidation = value
    45        End Set
    46    End Property

    47
    48End Class

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

     1    ''' <summary>
     2    ''' 将控件转换为对应的 HTML 程序代码。
     3    ''' </summary>
     4    ''' <param name="Control">控件。</param>

     5    Public Shared Function ControlToHTML(ByVal Control As System.Web.UI.Control) As String
     6        Dim sHTML As String = String.Empty
     7        Dim oTextWriter As New System.IO.StringWriter()
     8        Dim oHTMLWriter As New System.Web.UI.HtmlTextWriter(oTextWriter)
     9
    10        If Control.Page IsNot Nothing Then
    11            If TypeOf Control.Page Is TBBasePage Then
    12                DirectCast(Control.Page, TBActionPage).IsVerifyRender = False
    13            End If
    14        End If
    15
    16        Control.RenderControl(oHTMLWriter)
    17        sHTML = oTextWriter.ToString()
    18        Return sHTML
    19    End Function
  • 相关阅读:
    R语言对苏格兰独立民意调查的Meta分析
    R语言中固定与随机效应Meta分析
    Comet OJ
    luoguP6070 [MdOI2020] Decrease 贪心+二维差分
    luoguP6071 [MdOI2020] Treequery DFS序+主席树
    AT2064 [AGC005F] Many Easy Problems 容斥+NTT
    BZOJ 4650: [Noi2016]优秀的拆分 后缀自动机+启发式合并+线段树合并
    BZOJ 1498: [NOI2006]神奇的口袋 性质分析+高精度
    BZOJ 1819: [JSOI]Word Query电子字典 搜索+trie
    robotframework 随机选中下拉框中的值
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/1994946.html
Copyright © 2011-2022 走看看