VerifyRenderingInServerForm 方法的作用是确认在运行时为指定的 ASP.NET 服务器控件呈现 HtmlForm 控件。当控件将其内容写入页时,它使用 VerifyRenderingInServerForm 方法确保该控件显示在 HtmlForm 控件的开始和结束标记之间,否则会抛出异常.
?
异常类型 条件
HttpException
指定的服务器控件在运行时不包含在 HtmlForm 服务器控件的开始和结束标记之间。
ArgumentNullException
要验证的控件为 空引用(在 Visual Basic 中为 Nothing)。
必须位于 HtmlForm 控件中的 ASP.NET 服务器控件。
必须位于 <form runat=server> 标记中的控件可以在呈现之前调用此方法,以便在控件被置于标记外时显示错误消息。发送回或依赖于注册的脚本块的控件应该在 Control.Render 方法的重写中调用此方法。呈现服务器窗体元素的方式不同的页可以重写此方法以在不同的条件下引发异常。
?
如果回发或使用客户端脚本的服务器控件没有包含在 HtmlForm 服务器控件 (<form runat="server">) 标记中,它们将无法正常工作。这些控件可以在呈现时调用该方法,以在它们没有包含在 HtmlForm 控件中时提供明确的错误消息。
?
开发自定义服务器控件时,通常在为任何类型的输入标记重写 Render 方法时调用该方法。这在输入控件调用 GetPostBackEventReference 或发出客户端脚本时尤其重要。复合服务器控件不需要作出此调用。
?
Control.Render 方法
将服务器控件内容发送到提供的 HtmlTextWriter 对象,此对象编写将在客户端呈现的内容。
Page.Render 方法
初始化 HtmlTextWriter 对象并调用 Page 的子控件进行呈现。
?
下面的代码示例重写自定义服务器控件的 Page.Render 方法。当此控件将其内容写入页时,它使用 VerifyRenderingInServerForm 方法确保该控件显示在 HtmlForm 控件的开始和结束标记之间。
VB:
' Override the Render method to ensure that this control
' is nested in an HtmlForm server control, between a <form runat=server>
' opening tag and a </form> closing tag.
Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
??? ' Ensure that the control is nested in a server form.
??? If Not (Page Is Nothing) Then
??????? Page.VerifyRenderingInServerForm(Me)
??? End If
??? MyBase.Render(writer)
End Sub
?
C#:
// Override the Render method to ensure that this control
// is nested in an HtmlForm server control, between a <form runat=server>
// opening tag and a </form> closing tag.
protected override void Render(HtmlTextWriter writer) {
??? // Ensure that the control is nested in a server form.
??? if (Page != null) {
??????? Page.VerifyRenderingInServerForm(this);
??? }
??? base.Render(writer);
}
?
?
导出excel的时候,输出文件已经不是合法的aspx文件,我们唯一的办法,就是阻止系统掉用控件的检查方法,防止抛出异常.解决的方法就是重写VerifyRenderingInServerForm方法.
?
ExportToExcel.aspx
?
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="ExportToExcel.aspx.vb" Inherits="GridView20070201.ExportToExcel" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
??? <title>無題のページ</title>
</head>
<body>
??? <form id="form1" runat="server">
??? <div>
??????? <asp:GridView ID="GridView1" runat= "server" AutoGenerateColumns="False" DataKeyNames="RegionID"
??????????? DataSourceID="SqlDataSource1">
??????????? <Columns>
??????????????? <asp:BoundField DataField="RegionID" HeaderText="RegionID" ReadOnly="True" SortExpression="RegionID" />
??????????????? <asp:BoundField DataField="RegionDescription" HeaderText="RegionDescription" SortExpression="RegionDescription" />
??????????? </Columns>
??????? </asp:GridView>
???
??? </div>
??????? <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
??????????? SelectCommand="SELECT * FROM [Region]"></asp:SqlDataSource>
??????? <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="导出" />
??? </form>
</body>
</html>
?
?
ExportToExcel.aspx.vb
?
Public Partial Class ExportToExcel
??? Inherits System.Web.UI.Page
??? Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
??? End Sub
??? Protected Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
??????? Dim oStringWriter As System.IO.StringWriter
??????? Dim oHtmlTextWriter As System.Web.UI.HtmlTextWriter
??????? Response.Clear() 'HttpResponse对象
??????? Response.Buffer = True
??????? Response.Charset = "GB2312"
??????? Response.AppendHeader("Content-Disposition", "attachment;filename=FileName.xls")
??????? '如果设置为 GetEncoding("GB2312");导出的文件将会出现乱码!!!
??????? Response.ContentEncoding = System.Text.Encoding.UTF7
??????? Response.ContentType = "application/ms-excel" '设置输出文件类型为excel文件。
??????? oStringWriter = New System.IO.StringWriter()
??????? oHtmlTextWriter = New System.Web.UI.HtmlTextWriter(oStringWriter)
??????? Me.GridView1.RenderControl(oHtmlTextWriter)
??????? Response.Output.Write(oStringWriter.ToString())
??????? Response.Flush()
??????? Response.End()
??? End Sub
??? Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
??? End Sub
End Class