1

我遇到了Invalid Viewstate错误的一些问题,我可以理解它为什么会发生,但我不知道如何解决它。

我有一个与此类似的页面,/story/?id=123但我使用的是Server.Transfer与此页面不同的页面。

所以我已经设置并且它工作正常,直到页面回发给自己/infoServer.TransferRequest("/story/?id=123")

我们在这个页面上有一个登录表单,它只是重新加载页面,但是当它重新加载页面时,它似乎添加/?id=123到 URL 的末尾,所以它以这样的方式结束,/info/?id=123从而导致Invalid Viewstate错误。

我已经尝试添加EnableViewStateMac="false"- 这修复了错误,但它没有按预期登录用户,因此它没有给出所需的结果。

所以我的问题是:

  1. 有没有更好的方法来重定向到我的页面,Server.TransferRequest但仍然保留漂亮的 URL?Response.Redirect-如果我能避免它,我不想这样做。

  2. 如果没有,是否有一种简单的方法来修复这个不需要我添加的错误EnableViewStateMac="false"

4

1 回答 1

1

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>truetrue

当您调用该Server.Transfer方法并将第二个参数设置为 时true,您将保留QueryStringForm 集合。表单域之一是隐藏的 __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>")

此代码不会将QueryStringForm字段发送到被调用的页面。当没有数据传输时,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,然后单击提交

于 2012-05-24T21:50:41.230 回答