我有ASP.NET站点。在某一时刻触发回发并在服务器上修改一些数据并发送响应(具有新的视图状态)。 问题是我使用jQuery在页面上只显示该响应的一部分。这有效,但我在使用新值更新视图状态时遇到问题。 我有这样的事情:
var updatePreviewArea = function (nid) {
var $content = jQuery('<div></div>');
$content.load('http://site.com?nid=' + nid, function (response) {
var $response = jQuery(response);
jQuery('targetDiv1').replaceWith($response.find('#srcDiv1'));
jQuery('targetDiv2').replaceWith($response.find('#srcDiv2'));
// update viewstate from postback response
var selectors = ['#__VIEWSTATE', '#__EVENTVALIDATION'];
for (var i in selectors) {
var value = $response.find(selectors[i]).val();
jQuery(selectors[i]).val(value);
}
});
}
但在此之后我得到了:
Sys.WebForms.PageRequestManagerServerErrorException: Sys.WebForms.PageRequestManagerServerErrorException:验证 viewstate MAC失败。如果此应用程序由Web场托管或 cluster,确保配置指定相同 validationKey和验证算法。无法使用AutoGenerate 一个集群。'调用方法时:[nsIDOMEventListener :: handleEvent]
答案 0 :(得分:3)
您正在使用从服务器返回的视图状态并使用它更新您的内容页面。 ViewState基本上是一组编码的名称/值对,需要与页面上与其相关的内容进行匹配。如果您将ViewState视为一个页面并将其粘贴到另一个页面上,则加密值将不匹配,您将收到与您所看到的类似的错误。
由于您正在使用jQuery和AJAX从您的服务器动态获取内容,我不确定您为什么依赖ViewState(但我不熟悉您的应用程序)。
答案 1 :(得分:2)
我不会这样做(手动更新ViewState),因为这不是一件容易的事。至少,ViewState是一个BASE64编码的字符串,你必须编写相当多的javascript代码才能始终保持同步。我认为这成为维持的噩梦。在你的鞋子里,我会严格使用ajax而不是允许这样的帖子或让MS为你处理ViewState,并使用UpdatePanels,但我也不喜欢它们。
此外,如果您的应用由于某种原因,需要加密ViewState,您将无法维护您的应用。
答案 2 :(得分:1)
编码的__VIEWSTATE特定于生成它的页面。如果表单发布到的页面与生成视图状态的页面不匹配,您将收到视图状态验证错误。您有两种选择: