我有一个页面,其中包含一些搜索字段以查询数据库并显示结果。视图状态需要保留下拉列表中的项目列表。
Firefox(3)&amp ;; Chrome,但在Internet Explorer中失败,但有时仅失败(某些操作,例如重置表单,这实际上只是带有一些查询字符串参数的response.redirect)...在Viewstate中发生的事情被转储到URL上,并且错误页面被抛出。
以前有人遇到过这个吗?也许有些指针可能会导致IE中出现这种情况?
谢谢你,
格雷格
更新
进一步调查后,我确定实际错误是这样的:
“viewstate MAC验证失败。如果此应用程序由Web场或群集托管,请确保配置指定相同的validationKey和验证算法。无法在群集中使用AutoGenerate。”
可能有用的更多信息:这是由内容管理系统(Umbraco)中托管的用户控件引起的,这可能与将视图状态传递给页面的原因有关(作为控件包含在CMS中的更大页面中)。我将进一步调查这一点,但任何其他建议将不胜感激。
欢呼声 格雷格
更新2:
有人可以建议为什么这只发生在IE中(而不是在FF或Chrome中)?如果其他浏览器可以很好地处理它,似乎不太可能是控件更改或机器密钥或我在这个地方读过的其他建议的问题。
有什么想法可以导致IE失败吗?
SOLUTION:
原来这是一个非常愚蠢的问题 - 我在CMS中使用了错误的主模板,因此有2个表单标签。删除额外的表单标签,问题解决了!
感谢bendewey帮助我解决这个问题(请参阅bendewey帖子中的评论)。
这是我生命中的4个小时,我很想回来......但很高兴我能继续前进。再次感谢Stack Overflow社区:)
答案 0 :(得分:1)
您的视图状态发布到Url似乎有点奇怪。如果您有一些使用GET方法而不是默认的asp.net页面级别表单标签的自定义表单标记,则会发生这种情况。
如果你需要一个带有GET方法的表单标签,我会在页面声明上设置EnableViewState =“false”并设置某种列表缓存。这是一个示例,但您可以在线找到更好的样本(特别是那些进行双重检查锁定的样本)。这样你就可以在每个回发中调用它,而不用担心在viewstate中存储任何内容。
List<string> getCachedFields()
{
var searchFields = Cache["searchFields"] as List<string>;
if (searchFields == null)
{
searchFields = GetFieldsFromDbOrSomewhereExpensive();
Cache["searchFields"] = searchFields;
}
return searchFields;
}
答案 1 :(得分:1)
我们已使用此博客suggestion解决了此问题。请看看它......
答案 2 :(得分:0)
我必须从EnableViewStateMac="false"
元素中删除<pages>
以避免IE中的错误。