4

我有一个带有计时器控件的更新面板,它设置为每分钟左右自动检查一些数据更新。

如果它看到数据更新,则设置为使用序列化的 JSON 数据调用本地脚本。

ScriptManager.RegisterStartupScript(UpdateField, GetType(HiddenField), ACTION_CheckHistoryVersion, "updateData(" & data & ");", True)

“数据”可能看起来像

{
   "someProperty":"foo",
   "someOtherProperty":"bar",
   "someList":[
     {"prop1":"value"},
     {"prop2":"value"}, ...
   ],
   "someOtherList":[{},...,{}]
}

“数据”可能会变得非常大,有时只有少数项目发生变化。

我遇到的问题是这个。每次我将此发送回客户端时,它都会作为全新的脚本块添加,并且现有块不会被删除或替换。

输出看起来像这样:

<script type="text/javascript">
  updateData({
       "someProperty":"foo",
       "someOtherProperty":"bar",
       "someList":[
         {"prop1":"value"},
         {"prop2":"value"}, ...
       ],
       "someOtherList":[{},...,{}]
    });
</script>
<script type="text/javascript">
  updateData({
       "someProperty":"foo",
       "someOtherProperty":"bar",
       "someList":[
         {"prop1":"changed"},
         {"prop2":"val"}, ...
       ],
       "someOtherList":[{},...,{}]
    });
</script>
<script type="text/javascript">
  updateData({
       "someProperty":"foos",
       "someOtherProperty":"ball",
       "someList":[
         {"prop1":"changed"},
         {"prop2":"val"}, ...
       ]
    });
</script>

每次数据发生变化时都会创建一个新的脚本块。

随着时间的推移,如果我们继续添加它,浏览器上累积的数据量可能会变得巨大,我无法想象大多数人的浏览器会如何接受它,但我认为它不会是好的。

有谁知道是否有办法只替换已发送回浏览器的代码,而不是像这样连续添加它?

4

2 回答 2

2

我想出了一个似乎适用于我的情况的技巧。

我正在使用 jQuery 来查找我正在创建的脚本标签,并在它被调用后将其删除。

这是一个例子:

首先我生成一个指南:

Dim guidText as string = GUID.NewGuid().ToString()

我创建如下函数:

function RemoveThisScript(guid){

   $("script").each(function(){
     var _this = $(this);
     if(_this.html().indexOf(guid)>-1)
        _this.remove();
   });

}

然后我将以下代码添加到我的输出字符串中:

... & " RemoveThisScript('" & guidText & "');"

这会导致 jQuery 在页面上的所有脚本中查找具有 GUID 的脚本(本质上是调用函数的脚本)并将其从 DOM 中删除。

于 2012-09-12T14:31:11.743 回答
1

我建议将 Web 服务与一些您将在 window.setInterval 中调用的 Web 方法一起使用。在您的网络方法的成功处理程序中(在客户端),您可以只接受响应并使用它做任何您想做的事情。它不会保存在您的页面中(好吧,如果您做错了一切)。好处是您将最小化请求大小(更新面板将传递所有可能足够大的视图状态数据)并限制服务器资源的使用(更新面板导致整个页面的生命周期,假设稍微修改,但无论如何 - 所有这些 page_load, page_init 等...),并且使用 Web 服务,您将只需要您需要的东西。

是一篇文章,您可以在其中了解如何在客户端创建和使用它。看起来足够好。

于 2012-09-11T22:19:41.687 回答