http://support.microsoft.com/kb/316920
我相信那篇文章将解释您遇到问题的原因,并提供解决方案。
我知道您不想使用 Response.Redirect,但我认为这也可以解决问题。
PRB:使用 Server.Transfer 时出现“视图状态无效”错误消息
本文之前发布于Q316920
已停用的 KB 内容免责声明
本文是关于 Microsoft 不再提供支持的产品。因此,本文按“原样”提供,不再更新。
症状
使用 时HttpServerUtility.Transfer("page name", true)
,您会收到以下错误消息:
此页面的视图状态无效,可能已损坏
原因
出现此问题的原因是元素的EnableViewStateMac
属性
默认设置为。当此属性设置为 true 时,ASP.NET 在从客户端回发页面时对页面的视图状态运行消息身份验证检查 (MAC)。此检查确定页面的视图状态是否在客户端上被修改。出于安全目的,建议您将此属性设置为。<pages>
true
true
当您调用该Server.Transfer
方法并将第二个参数设置为 时true
,您将保留QueryString
和Form
集合。表单域之一是隐藏的 __VIEWSTATE 表单域,它保存页面的视图状态。视图状态消息验证检查失败,因为消息验证检查只检查每个页面。因此,调用页面的视图状态Server.Transfer
在目标页面上无效。
视图状态是页面范围的,仅对该页面有效。视图状态不应跨页面传输。
解析度
若要解决此问题,请使用下列方法之一。
决议 1
在页面之间传输值以将您的服务器控制值传递给其他页面。有关详细信息,请参阅以下 MSDN 文档: 在页面之间传递服务器控件值
这要求您为要从目标页面访问的控件的每个属性创建公共属性。
如果您有许多控件,并且想要从另一个页面访问这些控件的属性,您也可以将这些控件声明为公共变量。例如:
第1页.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,然后单击提交。