English 中文(简体)
视图状态仅在IE中失败
原标题:
  • 时间:2009-02-11 03:59:38
  •  标签:

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

在Firefox(3)和Chrome中一切都正常工作,但是在Internet Explorer中偶尔会失败(某些操作,例如重置表单,实际上只是使用一些查询字符串参数进行响应重定向)...视图状态会转储到URL上,并抛出错误页面。

有没有人遇到过这个问题? 或许有一些指示可以说明在IE中可能导致这种情况发生的原因?

非常感谢。

格雷格

更新:

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

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

可能有帮助的更多信息:这是由用户控件引起的,它被托管在内容管理系统(Umbraco)中,这可能与为什么将视图状态传递给页面有关(因为控件包含在CMS中更大的页面中)。我将进一步调查此事,但非常感谢任何其他建议。

cheers 格雷格

更新2:

有人能够解释为什么这种问题只出现在IE中(而不是在Firefox或Chrome)吗?如果其他浏览器都可以正常处理,那么控件变化或机器密钥或其他我在其他地方读到的建议可能都不太可能是问题的原因。

「有什麼想法是 IE 做得不同,可能導致這個失敗嗎??」

解决方案:

结果发现这是一个非常愚蠢的问题——我在CMS中使用错误的主模板,因此有两个表单标签。删除额外的表单标签,问题解决了!

感谢bendewey为帮助我解决这个问题(请参见bendewey的帖子中的评论)。

那是我想要回来的4个小时...但现在很高兴我可以继续前进。再次感谢Stack Overflow社区:)

最佳回答

你的Viewstate提交到URL看起来有点奇怪。如果你使用了GET方法而不是默认的ASP.NET页面级表单标签,就会出现这种情况。

如果您需要使用GET方法的表单标签,我会在页面声明上设置EnableViewState =“false”,并设置某种列表缓存。这是一个示例,但您可以在线上找到更好的示例(特别是那些进行双重检查锁定的示例)。这样,您可以在每个postback中调用它,而不必担心将任何内容存储在Viewstate中。

List<string> getCachedFields()
{
    var searchFields = Cache["searchFields"] as List<string>;
    if (searchFields == null)
    {
        searchFields = GetFieldsFromDbOrSomewhereExpensive();
        Cache["searchFields"] = searchFields;
    }
    return searchFields;
}
问题回答

我们使用这个博客的建议< a href=“http://ddkonline.blogspot.com/2008/04/validation-of-viewstate-mac-failed.html” rel =“nofollow noreferrer”>解决了这个问题。请看一看...

我必须从<pages>元素中删除EnableViewStateMac="false",以避免IE中的错误。





相关问题
热门标签