从回发响应更新视图状态

时间:2012-01-25 15:18:23

标签: javascript jquery asp.net postback viewstate

我有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]

3 个答案:

答案 0 :(得分:3)

您正在使用从服务器返回的视图状态并使用它更新您的内容页面。 ViewState基本上是一组编码的名称/值对,需要与页面上与其相关的内容进行匹配。如果您将ViewState视为一个页面并将其粘贴到另一个页面上,则加密值将不匹配,您将收到与您所看到的类似的错误。

由于您正在使用jQuery和AJAX从您的服务器动态获取内容,我不确定您为什么依赖ViewState(但我不熟悉您的应用程序)。

答案 1 :(得分:2)

我不会这样做(手动更新ViewState),因为这不是一件容易的事。至少,ViewState是一个BASE64编码的字符串,你必须编写相当多的javascript代码才能始终保持同步。我认为这成为维持的噩梦。在你的鞋子里,我会严格使用ajax而不是允许这样的帖子或让MS为你处理ViewState,并使用UpdatePanels,但我也不喜欢它们。

此外,如果您的应用由于某种原因,需要加密ViewState,您将无法维护您的应用。

答案 2 :(得分:1)

编码的__VIEWSTATE特定于生成它的页面。如果表单发布到的页面与生成视图状态的页面不匹配,您将收到视图状态验证错误。您有两种选择:

  1. 将您的AJAX请求发送到相同的页面,而不是另一个页面。
  2. 将表单的帖子URL设置为另一页的URL。