我刚刚在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" >
但是,它对我不起作用。
答案 0 :(得分:2)
在进一步阅读之前,请排除以下前提条件:
如果以下前提条件为真并且您单击了一个回发控件/链接并且该页面未在客户端浏览器中完全加载,则可能会出现“验证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