|
验证视图状态 mac 失败。如果此应用程序由网络场或群集承载,请确保 <machinekey> 配置指定了相同的 validationkey 和验证算法。不能在群集中使用 autogenerate。
说明: 执行当前 web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: system.web.httpexception: 验证视图状态 mac 失败。如果此应用程序由网络场或群集承载,请确保<machinekey> 配置指定了相同的 validationkey 和验证算法。不能在群集中使用 autogenerate。
分析:
分析后找到了问题的根源。首先,文章中提到,如果用gridview,并且指定了datakeynames属性,则出于安全的理由(因为datakeynames指定的字段代表数据的主键,且该主键值需要保存在视图状态中发送到客户端,用户如果篡改主键值,会导致安全问题),gridview会要求加密视图状态。为此会自动在页面表单</forms>之前添加一个<inputtype="hidden" name="__viewstateencrypted" id="__viewstateencrypted"value="" /> 。
然而,atlas的updatepanel要求放置在<form></form>内部,也就是</form>之前。这就意味着添加的隐藏input控件没有被放置在updatepanel内,而是放置在updatepanel和</form>之间。
当updatepanel更新时,updatepanel内部的控件被提交到服务器进行处理(patrialrendering),而整个页面并没有被提交。也就是说隐藏的input控件没有随着一起提交。因此服务器并不知道提交的viewstate被加密了,从而导致mac验证错误。
解决方法有二,仅供参考:
1.可以在当前页面的<page ...>里加两个属性:
2.当然还可以在web.config里加入:(<system.web>之间)
想学习黑1客技术 一直以来没有找到好的方法,最近发现一个地方还不错 推荐一个黑1客网站 www.hack6.com qq:283422135 可以联系15625253078 |
|