PRB:使用 Server.Transfer 时出现“View State Is Invalid”(视图状态无效)错误信息

文章翻译 文章翻译
文章编号: 316920 - 查看本文应用于的产品
本文的发布号曾为 CHS316920
展开全部 | 关闭全部

本文内容

症状

在使用 HttpServerUtility.Transfer("页名称", true) 时,您会收到下面的错误信息:
The View State is invalid for this page and might be corrupted

原因

发生此问题是因为,<pages> 元素的 EnableViewStateMac 属性默认情况下设置为 true。在将此属性设置为 true 后,ASP.NET 在页面从客户端返回时将对该页的视图状态运行消息身份验证检查 (MAC)。此检查确定是否已在客户端修改了该页的视图状态。为安全起见,建议您让此属性设置保持为 true

当您调用 Server.Transfer 方法并将第二个参数设置为 true 时,您就保留了 QueryString表单集合。表单域之一是隐藏的 __VIEWSTATE 表单域,它保留该页的视图状态。因为消息身份验证检查只检查每一页,所以视图状态消息身份验证检查失败。因此,来自调用 Server.Transfer 的页的视图状态在目标页上无效。

视图状态是页范围的并且只对该页有效。视图状态不应跨页传送。

解决方案

要解决此问题,请使用以下方法之一。

解决方案 1

在页之间传输值以便将您的服务器控件值传递给其他页。有关更多信息,请参阅以下 MSDN 文档:
在页间传递服务器控件值
http://msdn2.microsoft.com/en-us/library/6c3yckfw(vs.71).aspx
这要求您为要从目标页访问的控件的每一个属性创建公共属性。

如果您具有许多控件,并且想从其他页访问这些控件的属性,那么您还可以将这些控件声明为公共变量。例如:

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

在调用 Server.Transfer 时不要传递第二个参数(默认情况下为 false)。例如:
Server.Transfer("<page name>")
				
此代码不会将 QueryString表单域发送到被调用的页。在没有传送任何数据时,ASP.NET 不运行消息身份验证检查。

更多信息

重现此问题的步骤

  1. 创建一个名为 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>
    					
  2. 创建名为 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>
    					
  3. 在浏览器中打开 WebForm1.aspx,然后单击提交

属性

文章编号: 316920 - 最后修改: 2007年5月17日 - 修订: 3.2
这篇文章中的信息适用于:
  • Microsoft ASP.NET 1.0
关键字:?
kbprb kbstate kbwebforms KB316920
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com