4

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

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

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

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

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

更新:我已经在此处放置了显示问题的网站的精简版本:http: //dropbox.com/s/7wqgjqqdorgp958/stackoverflow.zip

4

3 回答 3

0

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

于 2013-04-08T12:57:36.697 回答
0

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

于 2013-04-11T07:00:24.667 回答
0

这种行为的原因是您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.Valuecat

于 2013-04-11T07:01:26.637 回答