【问题标题】:ViewState error points in site.mastersite.master 中的 ViewState 错误点
【发布时间】:2008-10-18 13:42:16
【问题描述】:

我刚刚在 asp.net mvc beta 应用程序的示例文件夹下的新页面中添加了 asp.net 日历控件。当我执行我需要的特定页面时,它会显示以下错误

视图状态 MAC 验证失败。如果此应用程序由 Web Farm 或集群托管,请确保配置指定相同的 validationKey 和验证算法。 AutoGenerate 不能在集群中使用。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

指向这里。它在 asp.net mvc 的 site.master 中

<div id="logindisplay">
    <% Html.RenderPartial("LoginUserControl"); %>
</div> 

通常为了避免这个错误,我们给

<pages  validateRequest="false" enableEventValidation="false" viewStateEncryptionMode ="Never" >

但是,它对我不起作用。

【问题讨论】:

标签: asp.net viewstate


【解决方案1】:

在进一步阅读之前,请排除以下先决条件:

  1. 您没有使用网络场。
  2. 在使用内置数据绑定控件时出现,例如 GridView、DetailsView 或 FormView,它们利用“DataKeyNames”。
  3. 如果您有一个因任何原因加载缓慢的大页面,就会出现这种情况。

如果以下前提条件为真,并且您单击回发控件/链接并且页面尚未在客户端浏览器中完全加载,您可能会收到“验证 ViewState MAC 失败”异常。

发生这种情况时,如果您只是尝试将页面属性“EnableViewStateMac”设置为false,并不能解决问题,它只是在相同的导航行为中更改错误消息:

此页面的状态信息无效,可能已损坏。

出现此异常是因为使用 DataKeyNames 的控件要求对 Viewstate 进行加密。当 Viewstate 被加密时(默认模式 Auto,如果控件需要,则加密,否则不加密),Page 在关闭

标记之前添加字段。但是这个隐藏字段可能没有被呈现给浏览器长时间运行的页面,如果你在它之前进行回发,浏览器会在没有这个字段的情况下启动回发(在表单发布集合中)。最终结果是,如果在回发时省略该字段,则页面不知道 Viewstate 已加密并导致上述异常。 IE。页面预计在您进行回发之前已完全加载。

顺便说一句,事件验证也存在类似的问题,因为 __EVENTVALIDATION 字段也呈现在表单的末尾。这是一项安全功能,可确保回发操作仅来自服务器允许和创建的事件,以帮助防止欺骗性回发。此功能是通过让控件在渲染时注册有效事件来实现的(如在其实际的 Render() 方法期间)。最终结果是,在您呈现的

标记的底部,您会看到如下内容: 。当回发发生时,ASP.NET 使用存储在此隐藏字段中的值来确保您单击的按钮调用有效事件。如果它无效,则会出现上述异常。

当您在 EventValidation 字段呈现之前回发时,就会出现此问题。如果启用了 EventValidation(默认情况下启用),但 ASP.net 在您回发时看不到隐藏字段,您也会遇到异常。如果您在表单完全呈现之前提交表单,则很可能 EventValidation 字段尚未呈现,因此 ASP.NET 无法验证您的点击。

解决方法

enableEventValidation 设置为 false 并将 viewStateEncryptionMode 设置为 Never,如下所示:

<pages enableeventvalidation="false" viewstateencryptionmode="Never">

这具有禁用验证和加密的不良副作用。在某些网站上,这样做可能没问题,但这不是最佳做法,尤其是在面向公众的网站中。

有关更多信息和其他解决方法,请参阅此blog entry

【讨论】:

    【解决方案2】:

    这发生在我几分钟前。幸运的是,我在这个主题上找到了this blog post。结果(至少对我来说)是我有两个表单,一个在页面上,一个在控件上。

    我不需要页面上的那个,所以我删除了它,错误就消失了。

    【讨论】:

      【解决方案3】:
      I have been struggling with this issue too since lasts few days and finally found the problem.
      
      This error will show up in there are multiple <form> tags are being rendered on a page (be it html <form></form> or Html.BeginForm()).
      Check the user controls being rendered, the content page section and also the Master page.
      Make sure there is only one form rendered on a page.
      
      This should fix your problem, if the issue persists, check for the for submit buttons rendered on the page (<input type="submit" …/>)
      
      Cheers!
      Mayank Srivastava
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        • 2012-09-25
        • 1970-01-01
        • 2018-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多