2012-09-11 36 views
4

我有一個更新面板,其中的定時器控件設置爲每分鐘左右自動檢查一些數據更新。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> 

與正在創建一個新的腳本塊,每次有數據的變化。

隨着時間的推移,瀏覽器上積累的數據量可能會很大,如果我們繼續增加這個數據,我無法想象大多數人的瀏覽器會如何使用它,但我認爲它不會很好。

有誰知道是否有辦法只是將已發回給瀏覽器的代碼替換掉,而不是像這樣連續添加它?

+0

我發現了一個黑客,我編輯了我的問題來顯示它。 – CStroliaDavis

+1

你可以簡單地使用webservice嗎? –

+0

請考慮發佈你的黑客作爲答案,而不是你的問題的更新,因爲這是適當的協議。如果延遲期間沒有更好的事情發生,你甚至會被鼓勵接受你自己的答案。 –

回答

1

我會推薦使用一些webmethod的web服務,你將在window.setInterval中調用它。在webmethod的成功處理程序中(客戶端),您可以採取響應並根據需要執行任何操作。它不會被保存在你的頁面中(好吧,如果你會做任何錯誤的)。好處是你可以最大限度地減少請求的大小(updatepanel會傳遞所有視圖狀態數據,這可能足夠大),並會限制服務器資源的使用(更新面板導致整個頁面的生命週期,假設稍有修改,但無論如何 - 所有這些page_load, page_init等)和Web服務,你將只有你需要的東西。

Here是一篇文章,您可以在其中看到如何在客戶端創建和使用它。看起來不錯。

+0

所以,這是一個選項,事實上,我已經看過http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/,但它需要更多的工作。在頁面背後的代碼中,我們組織有大量利用頁面上下文進行處理的對象,雖然我可以做很多工作來手動將它們連接到頁面上下文,但我的偏好並不是必須這樣做,因爲它不是微不足道的。由於這個答案對大多數人來說是正確的,我會接受它作爲答案。 – CStroliaDavis

1

我想出了一個似乎在我的情況下工作的黑客。

我使用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中刪除的腳本。