site.master中的ViewState错误点

时间:2008-10-18 13:42:16

标签: asp.net viewstate

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

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

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

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

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

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

但是,它对我不起作用。

3 个答案:

答案 0 :(得分:2)

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

  1. 您没有使用网络农场。
  2. 当使用内置的数据绑定控件(如GridView,DetailsView或FormView)使用“DataKeyNames”时出现。
  3. 如果您的网页因任何原因缓慢加载,则会显示。
  4. 如果以下前提条件为真并且您单击了一个回发控件/链接并且该页面未在客户端浏览器中完全加载,则可能会出现“验证ViewState MAC失败”异常。

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

      

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

    出现此异常是因为使用DataKeyNames 的控件要求Viewstate加密。当Viewstate被加密时(默认模式,自动,如果控件需要加密,否则不加密),页面在关闭&lt; form&gt;之前添加字段。标签。但是这个隐藏字段可能没有被渲染到具有长时间运行页面的浏览器,并且如果你在它之前进行回发,浏览器会启动回发而不使用此字段(在表单集合中)。最终结果是,如果在回发时省略此字段,则页面不知道Viewstate已加密并导致上述异常。 I.E.页面预计会在您回发之前完全加载。

    顺便说一下,类似的问题是事件验证,因为__EVENTVALIDATION字段也会在表单的末尾呈现。这是一项安全功能,可确保回发操作仅来自服务器允许和创建的事件,以帮助防止欺骗性回发。此功能通过让控件在呈现时注册有效事件(如在实际的Render()方法中)来实现。最终结果是在渲染的&lt; form&gt;底部标签,你会看到这样的东西:。发生回发时,ASP.NET使用存储在此隐藏字段中的值来确保您单击的按钮调用有效事件。如果它无效,则会出现上述异常。

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

    解决方法

    enableEventValidation设置为false,将viewStateEncryptionMode设置为Neve r,如下所示:

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

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

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

答案 1 :(得分:0)

几分钟前发生在我身上。幸运的是,我在这个问题上找到了this blog post。结果(对我而言,至少)是我有两种形式,一种在页面上,另一种在控件上。

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

答案 2 :(得分:0)

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