在做一个项目时候,当执行一个Postback会得到如下错误:
Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.]
在查阅了一些资料后,发现这个错误是由于Viewstate的加密和解密过程出现的差错引起的,引起此类错误的情况可能有:
- web farm 的使用;
- 使用GridView、DetailsView或者FormView等数据绑定组件时指定了DataKeyNames属性;
-文件很大,或者某些原因导致页面打开缓慢。
我是属于第二种情况,在删除页面中四个GridView的DataKeyNames之后,问题就解决了。
问题出现的原因:
GridView中使用DataKeyNames属性时,他的ViewsState会被加密,页面会在<form>标记封闭之前(</form>出现前)向浏览器添加<input type="hidden" name="__VIEWSTATEENCRYPTED" id="__VIEWSTATEENCRYPTED" value="" /> 标记。但是如果对于一个较大、执行缓慢的页面这个还没有将这些隐藏字段加载到浏览器中你就执行了PostBack,浏览器将会返回不含有这些字段的ViewState因而产生错误。