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

我有一个更新面板,其中设置了一个定时器控件,可以每分钟左右自动检查一些数据更新.

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

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

随着时间的推移,如果我们继续添加这个数据,那么浏览器上累积的数据量可能会变得非常大,而且我无法想象大多数人的浏览器会采用它,但我认为它不会很好.

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

最佳答案 我建议使用Web服务和一些webmethod,你将在window.setInterval中调用它.在您的webmethod的成功处理程序(在客户端),您可以采取响应并随心所欲地做任何事情.它不会保存在你的页面中(好吧,如果你做错了什么).好处是您将最小化请求大小(updatepanel将传递所有视图状态数据,这可能足够大)并将限制服务器资源使用(更新面板导致整页实时循环,假设略有修改,但无论如何 – 所有那些page_load, page_init等…)和网络服务,你只会得到你需要的东西.

Here是一篇文章,您可以在其中查看如何在客户端创建和使用它.看起来很好.

点赞