Viewstate 仅在 IE 中失败

Posted

技术标签:

【中文标题】Viewstate 仅在 IE 中失败【英文标题】:Viewstate fails in IE Only 【发布时间】:2010-10-06 19:52:54 【问题描述】:

我有一个页面,其中包含一些用于查询数据库并显示结果的搜索字段。视图状态需要保留下拉列表中的项目列表。

在 Firefox (3) 和 Chrome 中一切正常,但在 Internet Explorer 中失败,但仅在某些时候(某些操作,例如重置表单,实际上只是使用一些查询字符串参数执行 response.redirect)... 什么发生在 Viewstate 被转储到 URL 上,并抛出错误页面。

以前有人遇到过这种情况吗?也许一些关于什么可能导致在 IE 中发生这种情况的指针?

谢谢大家,

格雷格

更新:

经过进一步调查,我确定实际错误是这样的:

“viewstate MAC 验证失败。如果此应用程序由 Web Farm 或集群托管,请确保配置指定相同的 validationKey 和验证算法。不能在集群中使用 AutoGenerate。”

更多信息可能会有所帮助:这是由托管在内容管理系统 (Umbraco) 中的用户控件引起的,这可能与将视图状态传递给页面的原因有关(作为控件包含在 CMS 的更大页面中)。我将对此进行进一步调查,但任何其他建议将不胜感激。

干杯 格雷格

更新 2:

谁能说明为什么这只发生在 IE(而不是 FF 或 Chrome)中?如果其他浏览器可以很好地处理它,这似乎不太可能是控件更改或机器键或我在该地方阅读的其他建议的问题。

任何想法 IE 的不同之处可能导致此失败?

解决方案:

原来这是一个非常愚蠢的问题——我在 CMS 中使用了错误的主模板,因此有 2 个表单标签。去掉多余的form标签,问题解决!

非常感谢 Bendewey 帮我解决了这个问题(请参阅 Bendewey 帖子中的 cmets)。

这是我生命中的 4 个小时,我很想回来……但很高兴我现在可以继续前进。再次感谢 Stack Overflow 社区 :)

【问题讨论】:

如果您能多解释一下重定向并解释“在 URL 上转储视图状态”是什么意思,将会有所帮助。 重定向如下:Response.Redirect(String.Concat(strPageUrl, "?reset=true"));它所做的事情是这样的:domain/page.aspx?_VIEWSTATE=afdfkhadkjhqkjdasf 无论如何它已解决 - 是由多个表单标签引起的(如上所述) 【参考方案1】:

您的视图状态发布到 URL 似乎有点奇怪。如果您有一些使用 GET 方法而不是默认的 asp.net 页面级表单标记的自定义表单标记,则会发生这种情况。

如果您需要一个带有 GET 方法的表单标签,我会在页面声明中设置 EnableViewState="false" 并设置某种列表缓存。这是一个示例,但您可以在线找到更好的示例(特别是那些执行双重检查锁定的示例)。这样,您可以在每次回发时调用它,而不必担心在视图状态中存储任何内容。

List<string> getCachedFields()

    var searchFields = Cache["searchFields"] as List<string>;
    if (searchFields == null)
    
        searchFields = GetFieldsFromDbOrSomewhereExpensive();
        Cache["searchFields"] = searchFields;
    
    return searchFields;

【讨论】:

hmmm...我对每次加载页面时都访问数据库或其他昂贵的数据存储的想法并不疯狂——远非理想。更多信息在下一篇文章中...... 您不会每次都访问数据库。这就是缓存的用途。 您也可以检查您的来源并确保您没有 2 个表单标签。我从未见过这种情况,但不同的浏览器可能会使用多个表单标签做出不同的行为。 另一个选项是设置 EnableViewStateMac="false" WWWWWWOOOOOOWWWWWW - 伙计,我印象深刻!你是大海捞针的专业人士吗?我确实有 2 个表单标签(使用了错误的主模板) - 删除它可以解决问题!非常感谢 - 你摇滚!!!【参考方案2】:

我们已使用此博客的 suggestion 解决了此问题。请看一下...

【讨论】:

感谢您的链接,但我不认为这是我在本地运行的问题,并且它肯定会加载整个页面 - 它与点击速度无关。跨度> 【参考方案3】:

我不得不从 &lt;pages&gt; 元素中删除 EnableViewStateMac="false" 以避免 IE 中的错误。

【讨论】:

以上是关于Viewstate 仅在 IE 中失败的主要内容,如果未能解决你的问题,请参考以下文章

机器密钥不起作用 - viewstate mac 失败

form submit时将__VIEWSTATE和__VIEWSTATEGENERATOR一起post到另外的页面,出现验证视图状态 MAC 失败。

Viewstate MAC 验证失败 ASP.Net 2.0 SP2

jQuery Jcrop 和 PHP 实际上仅在 IE9 中不裁剪图像?

无法加载视图状态。仅在 IE 中发生错误

Websocket 握手仅在 IE 10 中立即关闭