正在从回发响应更新视图状态
Updating viewstate from postback response
我有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.PageRequestManager服务器错误异常:Sys.WebForms.PageRequestManagerServerErrorException:的验证viewstate MAC失败。如果此应用程序由Web场或集群,确保配置指定相同validationKey和验证算法。AutoGenerate不能用于集群。"调用方法时:[nsIDOMEventListener::handleEvent]
您正在获取从服务器返回的viewstate,并用它更新您的内容页面。viewstate基本上是一组编码的名称/值对,需要与相关页面上的内容相匹配。如果您获取一个页面的viewstate并将其粘贴在另一个页面上,加密的值将不匹配,您将得到一个与您所看到的类似的错误。
由于您使用jQuery和AJAX从服务器动态获取内容,我不确定您为什么依赖ViewState(但我不熟悉您的应用程序)。
我不会走这条路(手动更新ViewState),因为这不是一项容易的任务;至少,ViewState是一个BASE64编码的字符串,您必须编写大量的javascript代码才能始终保持同步。我认为这将成为一场噩梦。在你的情况下,我会严格使用ajax,而不是允许这样的post-back,或者让MS为你处理ViewState,并使用UpdatePanels,但我也不喜欢这些。
此外,如果您的应用程序出于某种原因需要加密ViewState,您将无法享受维护应用程序的乐趣。
编码的__VIEWSTATE特定于生成它的页面。如果表单发布到的页面与生成视图状态的页面不匹配,则会出现视图状态验证错误。你有两个选择:
- 将AJAX请求发送到相同的页面,而不是不同的页面
- 将表单的发布URL设置为其他页面的URL
- 如何使用更新图像源以响应新闻事件
- 使用ajax长轮询从外部API更新页面上的响应
- 如何创建对表单的自我更新响应
- 使用Ajax响应更新TextBox
- 原型js 如何使定期更新程序隐藏基于ajax响应的类元素
- 根据ajax json响应更新html表
- 通过响应按钮单击更改表标题,其中行使用 JSTL for 循环更新
- 使用SimpleHTTPServer响应的结果更新javascript变量的值
- 实现具有快速更新脉冲响应的卷积混响
- 使用Spine.Model.Ajax,如何在模型更新时处理响应的JSON中的额外属性
- 在单击事件时更新主干模型,并在更改位置之前等待响应
- 从 jquery ajax json 响应更新“选择”框中的选项值
- 从AJAX调用服务器响应更新HTML文本和图像
- 如何从AJAX响应更新大表
- 如何使用服务器响应更新Restangular模型对象
- 正在从回发响应更新视图状态
- 使用$.when()和.then基于$.getJSON响应更新数组
- 如何从post响应更新backbone.js中的集合
- AngularJS美元范围.Push不从$http数据响应更新视图
- 如何使HTML表单的响应更新页面上的文本