3

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

在 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 帖子中的评论)。

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

4

3 回答 3

1

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

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

List<string> getCachedFields()
{
    var searchFields = Cache["searchFields"] as List<string>;
    if (searchFields == null)
    {
        searchFields = GetFieldsFromDbOrSomewhereExpensive();
        Cache["searchFields"] = searchFields;
    }
    return searchFields;
}
于 2009-02-11T04:19:35.620 回答
1

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

于 2009-02-11T04:53:18.457 回答
0

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

于 2015-10-06T11:57:00.047 回答