4

タイマーコントロールが設定された更新パネルがあり、1分ごとにいくつかのデータ更新を自動的にチェックします。

データが更新されたことがわかると、シリアル化された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を使用して、作成しているスクリプトタグを見つけ、呼び出された後に削除します。

次に例を示します。

まず、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から削除します。

于 2012-09-12T14:31:11.743 に答える
1

window.setInterval内で呼び出すいくつかのwebmethodでWebサービスを使用することをお勧めします。Webメソッドのサクセスハンドラー(クライアント側)では、応答を受け取り、それを使って好きなことを行うことができます。そして、それはあなたのページに保存されません(まあ、あなたがすべてを間違ってするなら)。利点は、リクエストサイズを最小化し(updatepanelはすべてのビューステートデータを渡すため、十分な大きさになる可能性があります)、サーバーリソースの使用を制限することです(更新パネルはページ全体のライブサイクルを引き起こしますが、わずかに変更されたと思いますが、とにかく-すべてのpage_load、 page_initなど...)そしてWebサービスを使用すると、必要なものだけが得られます。

これは、クライアント側でどのように作成および使用できるかを確認できる記事です。十分に良さそうです。

于 2012-09-11T22:19:41.687 に答える