我有一个相当简单的页面,带有一组jQuery选项卡,其中一些选项卡的内容是通过ajax调用的。我也有一个搜索框在我的标题母版页中。
当我打开选项卡式页面时,搜索框工作正常。然而,一旦我点击了一个ajax选项卡,搜索框就无法处理"Invalid Viewstate“的黄色死亡屏幕。
我相信这是因为ajax页面用自己的输入替换了__VIEWSTATE隐藏输入。
我怎样才能停止这种行为呢?
更新:我注意到YSOD只出现在IE和Chrome中,Firefox似乎没有同样的问题。虽然浏览器是如何影响ViewState的,但我不确定。
更新:我已经在这里放了一个显示问题的网站的精简版本:http://dropbox.com/s/7wqgjqqdorgp958/stackoverflow.zip
发布于 2013-04-11 15:01:27
这种行为的原因是您异步地获取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.Value作为cat参数而不是navBarSearchCatHiddenField。
发布于 2013-04-08 20:57:37
我猜您使用AJAX来填充选项卡的内容。因此,在这种情况下,选项卡的内容将被来自ajax的新内容替换,当然_VIEWSTATE也将被替换。在服务器端,您是否使用来自ViewState的数据?在“静态标签”中,你应该使用cache:true阻止它们自动重新加载。
发布于 2013-04-11 15:00:25
您的问题是,使用ajax调用会带来一个完整的ASPX页面。包括Form标签及其Viewstate。如果您从ajaxTab.aspx中删除了Form标记,您将看到一切工作正常。asp.net不知道如何在一个页面中处理两个Form标记。隐藏的Viewstate字段也是如此。您无法通过ajax引入完整的aspx页面。只需引入您想要显示的内容Div,您就可以开始工作了。
https://stackoverflow.com/questions/15807367
复制相似问题