PRB:使用 Server.Transfer 时出现“视图状态无效”错误消息
本文之前发表于 Q316920
已停用的 KB 内容免责声明
这篇文章是关于 Microsoft 不再支持的产品
提供支持。因此,本文按“原样”提供,不会
不再更新。
症状
当您使用HttpServerUtility.Transfer("page name", true) 时,您
收到以下错误消息:
此页面的视图状态无效,可能已损坏
原因
出现这个问题是因为EnableViewStateMac 属性
<pages> 元素默认设置为 true。当这个属性是
设置为 true,ASP.NET 在
当页面从客户端回发时查看页面的状态。
此检查确定页面的视图状态是否在
客户端。为安全起见,建议您保留
此属性设置为true。
当您调用Server.Transfer 方法并设置第二个
true 的参数,您保留 QueryString 和 Form
收藏品。表单域之一是隐藏的 __VIEWSTATE 表单
字段,它保存页面的视图状态。视图状态消息
身份验证检查失败,因为消息身份验证检查
只检查每一页。因此,来自页面的视图状态
调用 Server.Transfer 在目标页面上无效。
视图状态是页面范围的,仅对该页面有效。查看状态
不应跨页面传输。
分辨率
要解决此问题,请使用以下方法之一。
决议 1
在页面之间传递值以将您的服务器控制值传递给
其他页面。有关详细信息,请参阅以下 MSDN
文档:Passing Server Control Values Between
Pages
这要求您为每个属性创建公共属性
您要从目标页面访问的控件。
如果你有很多控件,并且你想访问
这些控件来自另一个页面,您也可以声明这些控件
作为公共变量。例如:
Page1.aspx
Public Class Page1
Public WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
'Insert your code here.
End Class
Page2.aspx
Dim sourcePage As Page1
sourcePage = CType(Context.Handler, WebForm1)
Response.Write(sourcePage.TextBox1.Text)
决议 2
不传递第二个参数(默认为false)时
你打电话给Server.Transfer。例如:
Server.Transfer("<page name>")
此代码不会将 QueryString 和 Form 字段发送到
被调用的页面。没有数据传输时,ASP.NET 不会运行
消息验证检查。
更多信息
重现行为的步骤
-
创建一个名为 WebForm1.aspx 的 .aspx 页面,将执行转移到另一个页面。将以下代码添加到 WebForm1.aspx:
<%@ Page language="vb" AutoEventWireup="true" %>
<html>
<body>
<form id="WebForm1" method="post" runat="server">
<asp:TextBox id="txtName" runat="server">Your Name</asp:TextBox><br>
<asp:Button id="Button1" runat="server" Text="Submit" OnClick="Button1_Click"></asp:Button>
</form>
</body>
</html>
<script runat=server>
Sub Button1_Click(sender As Object, e As System.EventArgs)
Server.Transfer("WebForm2.aspx",true)
End Sub
</script>
-
创建另一个名为 WebForm2.aspx 的 .aspx 页面,然后添加以下代码:
<%@ Page language="vb" AutoEventWireup="true" %>
<html>
<body>
<form id="WebForm2" method="post" runat="server">
<asp:Label id="lblName" runat="server" >Web Form 2</asp:Label>
</form>
</body>
</html>
<script runat=server>
Sub Page_Load(sender As Object, e As EventArgs)
Dim thisPage As System.Web.UI.Page
Dim nameTextBox As TextBox
thisPage = CType(Context.Handler, System.Web.UI.Page)
nameTextBox = CType(thisPage.FindControl("txtName"), System.Web.UI.Control)
lblName.Text = "Your name is '" & nameTextBox.Text & "'."
End Sub
</script>
在浏览器中打开 WebForm1.aspx,然后单击提交。