【问题标题】:Updating viewstate from postback response从回发响应更新视图状态
【发布时间】:2012-01-25 15:18:22
【问题描述】:

我有 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:验证 视图状态 MAC 失败。如果此应用程序由 Web Farm 托管或 集群,确保配置指定相同 validationKey 和验证算法。自动生成不能用于 一个集群。调用方法时:[nsIDOMEventListener::handleEvent]

【问题讨论】:

  • 您使用 jQuery 加载的页面是否与原始页面相同?你有网络场吗?
  • 不是同一个页面,也不是农场(但是我已经设置了机器密钥)

标签: javascript jquery asp.net postback viewstate


【解决方案1】:

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

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

【讨论】:

  • 是的,在另一个页面上使用视图状态是愚蠢的。我重构了代码,以便使用相同的页面。我继承了这个应用程序,它将被重写为只使用没有回发的 ajax/jquery,但我必须在那之前工作:)
  • 啊,继承的应用程序。节哀顺变。 :) 重写祝你好运——听起来你是在正确的道路上!
  • -1 @DavidHoerster ViewState 根本不加密,除非您明确告诉 asp.net 您要对其进行加密。编码!= 加密。
  • @DavidHoerster 现在 +1 :) 好多了!
  • @Icarus 谢谢。我需要对此做一个心理记录。我发现自己时不时地转换这些术语,它们显然不是同义词。谢谢你让我诚实!
【解决方案2】:

我不会走这条路(手动更新 ViewState),因为这不是一件容易的事;至少,ViewState 是一个 BASE64 编码的字符串,您必须编写大量的 JavaScript 代码才能始终保持同步。我认为这将成为一场噩梦。在你的鞋子里,我会使用严格的 ajax,而不是允许像这样的回发,或者让 MS 为你处理 ViewState,并使用 UpdatePanels,但我也不喜欢那些。

此外,如果您的应用出于某种原因需要对 ViewState 进行加密,那么您将无法享受维护应用的乐趣。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 2021-03-21
      • 2019-01-07
      • 1970-01-01
      相关资源
      最近更新 更多