ASP.Net 2.0:浏览器返回按钮 - 无效的回发或回调参数

3
我有一个简单的页面,初始加载时绑定到 GridView。这个 GridView 启用了排序和分页,并且还被 UpdatePanel 包围着。
当用户执行以下操作时,我会收到此错误:
Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
  • 点击分页器以跳转到指定页面(比如第5页)
  • 点击链接以导航到另一个页面
  • 按下浏览器的后退按钮返回带有GridView的页面
  • 由于浏览器未跟踪,因此网格现在已恢复为其原始状态(在第1页),因此用户再次单击以转到第5页,从而导致错误。

有人知道是什么原因引起的吗?只有在单击同一页时才似乎存在问题。如果在返回访问时单击不同的页面,则没有问题。如果对列进行排序,然后在返回访问时再次排序,也没有问题。我不确定关于两次单击页面特别会导致问题的具体原因。

这是分页器的代码:

protected void gvResults_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    gvResults.DataSource = SearchResults;
    gvResults.PageIndex = e.NewPageIndex;
    gvResults.DataBind();
}

其中gvResults是GridView,“SearchResults”是存储在viewstate中的列表。

编辑

似乎当用户返回页面时(恢复到第1页),虽然GridView没有显示第5页,但出于某种原因浏览器确实保存了视图状态,并且将GridView保存在第5页。因此,如果我单击第4页并通过分页事件的代码,我可以看到它认为它所在的页面是5……即使显示的内容是第1页的内容。

故事的寓意是显然当用户单击“返回”按钮返回页面时,视图状态得到了保存,但显示的表格却没有。

3个回答

1
这个错误与浏览器中的缓存内容有关。因此,解决办法是禁止在浏览器中缓存此页面:
        Response.Cache.SetCacheability(HttpCacheability.NoCache)
        Response.Cache.SetExpires(DateTime.Now)

根据该页面的流量,您可能需要找到另一种解决方案,因为停止缓存可能会迅速成为一条不好走的路。 - Peter Oram

0

发生的情况正是错误所说的 - 用户在点击“返回”按钮后尝试使用的控件不是原始控件,因为它是从缓存中加载的。这可以通过您那里的易失性数据或时间戳来识别 - 我不知道哪个。

您可以做的是放置

<%@ Page EnableEventValidation="false" %>

在那个页面上尝试一下,然后让我们知道它是否有效,以及是否影响了页面上的其他内容...

1
那样做可以解决问题;但如果有其他解决问题的方法,我宁愿不关闭验证。 - John

0
在搜索后,我并没有找到一个合理的答案;但是,我发现你可以使用3.5预览控件与asp.net 2.0一起使用,所以我将History控件添加到页面中,并让它处理后退按钮问题。
看起来这解决了问题。
谢谢!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接