使用 jQuery 选项卡时 ViewState 无效

Invalid ViewState when using jQuery tabs

提问人:Gordon Copestake 提问时间:4/4/2013 最后编辑:Gordon Copestake 更新时间:4/11/2013 访问量:1016

问:

我有一个相当简单的页面,其中包含一组jQuery选项卡,其中一些选项卡的内容是通过ajax调用的。我在标题的母版页中也有一个搜索框。

当我打开选项卡式页面时,搜索框工作正常。但是,一旦我单击了其中一个ajax选项卡,搜索框就无法使用“无效的视图状态”黄色死屏。

我相信这是因为ajax页面正在用自己的输入替换隐藏的输入。__VIEWSTATE

我怎样才能阻止这种行为?

更新:我注意到YSOD只出现在IE和Chrome中,Firefox似乎没有同样的问题。虽然浏览器如何影响 ViewState,但我不确定。

更新:我在这里放置了一个显示问题的网站的精简版本:http://dropbox.com/s/7wqgjqqdorgp958/stackoverflow.zip

C# jQuery asp.net 视图状态 jquery-tabs

评论

0赞 Davin Tryon 4/8/2013
您是否在多个 Web 服务器之间进行负载平衡?
0赞 Gordon Copestake 4/8/2013
没有一个服务器实际上既是 Web 服务器又是 SQL Server
0赞 Davin Tryon 4/8/2013
您使用的是 ViewState 吗?你能禁用它吗?
0赞 Davin Tryon 4/8/2013
另外,你能发布你收到的整个错误消息吗?
0赞 DotNetRussell 4/8/2013
您在firefox中使用firebug插件吗?它应该告诉你哪些部分搞砸了

答:

0赞 Phong Vo 4/8/2013 #1

我猜您使用 AJAX 来填充选项卡的内容。因此,在这种情况下,选项卡的内容将被 ajax 中的新选项卡替换,并且肯定会替换_VIEWSTATE。在服务器上,是否使用来自 ViewState 的数据?在“静态选项卡”中,您应该使用cache:true

评论

0赞 Gordon Copestake 4/8/2013
是的,我正在使用视图状态数据,因此无法禁用它。我不明白你说的“使用 cache:true 防止自动重新加载”是什么意思,你能详细说明一下吗?
0赞 Elad Lachmi 4/11/2013 #2

你的问题是,通过你的ajax调用,你带来了一个完整的页面。包括标签及其 .如果您从中删除标签,您将看到一切正常。asp.net 不知道如何在一个页面中处理两个标签。隐藏字段也是如此。您无法通过 ajax 引入完整的 aspx 页面。只需带上您想要显示的内容,您就可以开始了。ASPXFormViewstateFormajaxTab.aspxFormViewstateDiv

0赞 Yuriy Rozhovetskiy 4/11/2013 #3

这种行为的原因是,您异步获取页面的内容,并将其粘贴到另一个 aspx 页面中。因此,您将获得两个带有名称的隐藏字段实例,当页面回发到服务器时,它们的值会混合在一起(可能取决于浏览器在提交时如何处理具有相同控件的多个控件)。要解决此问题,您可以将第二个选项卡的内容放入框架中:ajaxTab.aspx__VIEWSTATEname

 <div id="tabs">
      <ul>
           <li><a href="#tabs-1">Default Tab</a></li>
           <li><a href="#tabs-2">ajax Content</a></li>
      </ul>
      <div id="tabs-1">
           <p>
                To replicate the error:
                <ul>
                     <li>First use the search box top right to search to prove that code is ok</li>
                     <li>Then click the second ajax tab, and search again.</li>
                     <li>N.B. Chrome / IE give a state error, Firefox does not</li>
                </ul>
           </p>
      </div>
      <iframe id="tabs-2" src="ajaxTab.aspx" style="width:100%;" ></iframe>
 </div>

另外,我不确定,但这似乎是控件中的错误。在我看来,方法必须重构如下:Web_UserControls_searchNavBarSearchItemNoSearchItem_OnClick

protected void NavBarSearchItemNoSearchItem_OnClick(object sender, EventArgs e)
{
    var searchFieldTbx = NavBarSearchItemNo;
    var navBarSearchCatHiddenField = NavBarSearchCatHiddenField;

    var term = searchFieldTbx != null ? searchFieldTbx.Text : "";

    if (term.Length > 0) //There is actually something in the input box we can work with
    {
        //Response.Redirect(Url.GetUrl("SearchResults", term));
        Response.Redirect(ResolveClientUrl("~/Web/SearchResults.aspx?term=" + term + "&cat=" + navBarSearchCatHiddenField.Value));
    }
}

请注意,我们在重定向到搜索结果页面时解析客户端 url,而不是用作参数。navBarSearchCatHiddenFieldnavBarSearchCatHiddenField.Valuecat

评论

0赞 Elad Lachmi 4/11/2013
2013 年的 I donIFrame' 是可以的(Thatdiv'将是一个更现代的解决方案。t think that using an s just IMHO). I think bringing in just the content
0赞 Yuriy Rozhovetskiy 4/11/2013
@EladLachmi 我不认为使用任何 html 标签取决于当前年份、天气或一天中的时间。如果它解决了一个问题,那么它就可以被使用。如果 OP 在页面上有任何必须在服务器端处理的服务器控件,我看不到任何替代解决方案。ajaxTab
0赞 Elad Lachmi 4/11/2013
不要误会我的意思,暗示这也是我的第一直觉,我确实认为有些标签可能会过时(恕我直言,这个标签已经过时了)。 在成为可行的选择之前用于这些类型的事情。对我来说,这似乎是一种退步。IFrameIFrameajax
0赞 Gordon Copestake 4/11/2013
尤里,我认为这是正确的解决方案。我正在测试我的代码。
0赞 Elad Lachmi 4/11/2013
@YuriyRozhovetskiy:猜你是对的。对于这些情况,An 是唯一的解决方案。IFrame