回发到同一页面时,viewstate错误无效

时间:2012-05-24 19:53:31

标签: asp.net viewstate server.transfer

我遇到了一些无效的Viewstate 错误的问题,我可以理解为什么会发生这种情况,但我不知道如何修复它。

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

所以我已将/info设置为Server.TransferRequest("/story/?id=123"),它可以正常运行,直到该页面回传给自己。

我们在此页面上有一个登录表单,它只是重新加载页面,但是当它出现时,它似乎将/?id=123添加到URL的末尾,因此它最终会像/info/?id=123那样导致< em>无效的Viewstate 错误。

我已经尝试添加EnableViewStateMac="false" - 这会修复错误,但不会按预期记录用户,因此无法提供所需的结果。

所以我的问题是:

  1. 除了Server.TransferRequest之外,还有更好的方法可以重定向到我的网页,但仍然保留了不错的网址吗? - 如果可以避免,我不想Response.Redirect

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  

PRB:使用Server.Transfer

时“查看状态无效”错误信息      

本文的发布号曾为Q316920

     

已退休的知识库内容免责声明

     

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

     

症状

     

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

     
    

视图状态对于此页面无效且可能已损坏

  
     

原因

     

发生此问题是因为EnableViewStateMac属性   默认情况下,<pages>元素设置为true。当这个属性是   设置为true,ASP.NET在上运行消息身份验证检查(MAC)   查看从客户端回发页面时的页面状态。   此检查确定是否已修改页面的视图状态   客户端。出于安全考虑,建议您保留   此属性设置为true

     

当您调用Server.Transfer方法并设置第二个方法时   参数true,保留QueryStringForm   集合。其中一个表单字段是隐藏的__VIEWSTATE表单   field,保存页面的视图状态。视图状态消息   验证检查失败,因为消息验证检查   只检查每一页。因此,从页面的视图状态   电话Server.Transfer在目标网页上无效。

     

视图状态是页面范围的,仅对该页面有效。查看状态   不应跨页面转移。

     

解决方案

     

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

     

决议1

     

在页面之间传输值以将服务器控件值传递给   其他页面。有关更多信息,请参阅以下MSDN   文档:Passing Server Control Values Between Pages   这要求您为a的每个属性创建公共属性   您想要从目标页面访问的控件。

     

如果您有许多控件,并且想要访问其属性   这些控件来自另一个页面,您也可以声明这些控件   作为公共变量。例如:

     

<强> 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.   
  3. 创建另一个名为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>
    
  4.   
  5. 在浏览器中打开WebForm1.aspx,然后点击提交

  6.