【问题标题】:Invalid viewstate error when posting back to same page回发到同一页面时出现无效的视图状态错误
【发布时间】:2012-05-24 19:53:31
【问题描述】:

我遇到了一些与 Invalid Viewstate 错误有关的问题,我可以理解为什么会这样,但我不知道如何解决。

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

所以我已经将/info 设置为Server.TransferRequest("/story/?id=123"),它可以正常工作,直到页面回发到自身。

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

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

所以我的问题是:

  1. 除了Server.TransferRequest 之外,有没有更好的方法可以重定向到我的页面,但仍保留漂亮的 URL? - 如果可以避免,我不想Response.Redirect

  2. 如果没有,有没有不需要我添加 EnableViewStateMac="false" 的简单方法来修复此错误?

【问题讨论】:

标签: asp.net viewstate server.transfer


【解决方案1】:

http://support.microsoft.com/kb/316920

我相信这篇文章会解释您遇到问题的原因,并提供解决方案。

我知道您不想使用 Response.Redirect,但我认为这也可以解决问题。

PRB:使用 Server.Transfer 时出现“视图状态无效”错误消息

本文之前发表于 Q316920

已停用的 KB 内容免责声明

这篇文章是关于 Microsoft 不再支持的产品 提供支持。因此,本文按“原样”提供,不会 不再更新。

症状

当您使用HttpServerUtility.Transfer("page name", true) 时,您 收到以下错误消息:

此页面的视图状态无效,可能已损坏

原因

出现这个问题是因为EnableViewStateMac 属性 <pages> 元素默认设置为 true。当这个属性是 设置为 true,ASP.NET 在 当页面从客户端回发时查看页面的状态。 此检查确定页面的视图状态是否在 客户端。为安全起见,建议您保留 此属性设置为true

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

此代码不会将 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,然后单击提交

【讨论】:

  • 感谢您的链接 - 我早些时候看到了,不幸的是无法使用任何解决方案 - 也许我只需要使用 Response.Redirect 毕竟。
猜你喜欢
  • 2011-12-30
  • 2014-10-05
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多