正在从回发响应更新视图状态

Updating viewstate from postback response

本文关键字:响应 更新 视图状态      更新时间:2023-09-26

我有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特定于生成它的页面。如果表单发布到的页面与生成视图状态的页面不匹配,则会出现视图状态验证错误。你有两个选择:

  1. 将AJAX请求发送到相同的页面,而不是不同的页面
  2. 将表单的发布URL设置为其他页面的URL