使用jQuery选项卡时ViewState无效

本文关键字:ViewState 无效 jQuery 选项 使用 | 更新日期: 2023-09-27 18:07:25

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

当我打开选项卡式页面时,搜索框工作正常。然而,一旦我点击了其中一个ajax选项卡,搜索框就无法使用"无效视图状态"黄色死亡屏幕。

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

我该如何制止这种行为?

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

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

使用jQuery选项卡时ViewState无效

这种行为的原因是异步获取ajaxTab.aspx页面的内容并将其粘贴到另一个aspx页面中。因此,您获得了两个具有__VIEWSTATE名称的隐藏字段实例,并且当页面发布回服务器时,它们的值是混合的(可能取决于浏览器在提交时如何处理具有相同name的多个控件(。要解决这个问题,您可以将第二个选项卡的内容放入一个框架中:
 <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_search控件中的错误。在我看来,NavBarSearchItemNoSearchItem_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,而不是使用navBarSearchCatHiddenField,而是使用navBarSearchCatHiddenField.Value作为cat参数。

我猜您使用AJAX来填充选项卡的内容。因此,在这种情况下,您的选项卡的内容将被AJAX中的新内容替换,当然_VIEWSTATE也将被替换。在服务器上,是否使用ViewState中的数据?在"静态选项卡"中,您应该使用cache:true 来防止它们自动重新加载

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