我遇到了一些无效的Viewstate 错误的问题,我可以理解为什么会发生这种情况,但我不知道如何修复它。
我有一个与此/story/?id=123
类似的页面,但我在此页面使用了与Server.Transfer
不同的页面。
所以我已将/info
设置为Server.TransferRequest("/story/?id=123")
,它可以正常运行,直到该页面回传给自己。
我们在此页面上有一个登录表单,它只是重新加载页面,但是当它出现时,它似乎将/?id=123
添加到URL的末尾,因此它最终会像/info/?id=123
那样导致< em>无效的Viewstate 错误。
我已经尝试添加EnableViewStateMac="false"
- 这会修复错误,但不会按预期记录用户,因此无法提供所需的结果。
所以我的问题是:
除了Server.TransferRequest
之外,还有更好的方法可以重定向到我的网页,但仍然保留了不错的网址吗? - 如果可以避免,我不想Response.Redirect
。
如果没有,是否有一种简单的方法可以修复此错误,而不需要我添加EnableViewStateMac="false"
?
答案 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
,保留QueryString
和Form
集合。其中一个表单字段是隐藏的__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>")
此代码不会将
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,然后点击提交。