我有一个相当简单的页面,其中包含一组jQuery选项卡,其中一些内容通过ajax调用。我的标题中的母版页中也有一个搜索框。
当我打开标签页时,搜索框工作正常。但是,一旦我点击其中一个ajax标签,搜索框就无法使用“无效的视图状态”黄色死机屏幕。
我相信这是因为ajax页面正在用自己的__VIEWSTATE
隐藏输入替换。
如何阻止此行为?
更新:我注意到YSOD只出现在IE和Chrome中,Firefox似乎没有同样的问题。虽然浏览器如何影响ViewState,但我不确定。
更新:我在网站上放了一个显示问题的网站版本:http://dropbox.com/s/7wqgjqqdorgp958/stackoverflow.zip
答案 0 :(得分:0)
我猜您使用AJAX来填充选项卡的内容。因此,在这种情况下,选项卡的内容将被ajax中的新内容替换,当然_VIEWSTATE将被替换。在服务器上,您是否使用ViewState中的数据?在“静态标签”中,您应该使用cache:true
答案 1 :(得分:0)
您的问题是,通过您的ajax通话,您会带来一个完整的ASPX
页面。包括Form
标记及其Viewstate
。如果您从Form
中删除ajaxTab.aspx
标记,您会发现一切正常。 asp.net不知道如何在一个页面中处理两个Form
标记。隐藏的Viewstate
字段也是如此。你不能通过ajax引入一个完整的aspx页面。只需引入您想要展示的内容Div
,就可以了。
答案 2 :(得分: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));
}
}
请注意我们在重定向到搜索结果页时解析客户端网址,而不是navBarSearchCatHiddenField
使用navBarSearchCatHiddenField.Value
作为cat
参数。