ScriptManager.RegisterStartupScript保持多次添加脚本块

ScriptManager.RegisterStartupScript Keeps adding script blocks multiple times

本文关键字:添加 脚本 RegisterStartupScript ScriptManager      更新时间:2023-09-26

我有一个带有定时器控制的更新面板,可以每隔一分钟左右自动检查一些数据更新

如果它看到数据更新,则设置为使用序列化的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>

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

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

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

我想出了一个似乎适合我的破解方法。

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

这里有一个例子:

首先我生成一个guid:

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中删除。

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

这里有一篇文章,您可以看到如何在客户端创建和使用它。看起来已经足够好了。