2010-03-17 28 views
1

我在用戶控件中有一個樹形視圖。我需要運行一個JavaScript函數與每個異步回發滾動它的div在正確的位置。我已經有了它,但我認爲必須有一種「更乾淨」的方式來實現它。在控件的Page_Load函數中,我有以下代碼。有沒有更好的方法來做到這一點?如何註冊一個Javascript函數以便在每次回發時運行?

ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "key" + DateTime.Now.Ticks, "RestorePosition();", true);

爲了任何人尋找這個答案的利益,這裏是我終於做了這個工作。在ASCX頁面的頂部,我有下面的代碼:


<script type="text/javascript"> 
    function pageLoad(sender, args) { 
     Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(SavePosition); 
     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(RestorePosition); 
    } 

    function SavePosition(sender, args) { 
     document.getElementById('hdnScrollSaver').value = document.getElementById('reportTreeViewdiv').scrollTop; 
    } 
    function RestorePosition(sender, args) { 
     document.getElementById('reportTreeViewdiv').scrollTop = document.getElementById('hdnScrollSaver').value; 
    } 

</script> 

然後我包裹在樹狀div標籤如下:


<div class="reportTreeView" id="reportTreeViewdiv"> 
        <asp:TreeView ID="TreeView1" runat="server" OnTreeNodePopulate="TreeView1_TreeNodePopulate" 
         OnSelectedNodeChanged="TreeView1_SelectedNodeChanged" PathSeparator="|" SkinID="ReportTreeView" /> 
       </div>

希望這可以幫助別人。

回答

4

Ajax爲您提供了一個類似於ASP.Net頁面的頁面生命週期,但在客戶端。因此,在pageLoad事件中,我們可以連接函數以在每個開始請求和結束請求上調用。

function pageLoad(sender, args) { 
    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest); 
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest); 
} 

function beginRequest(sender, args) { 
     // begin request code - i.e. make a "processing" div visible 
} 

function endRequest(sender, args) { 
     // we are back 
     RestorePosition(); 
} 
+0

這樣做了。謝謝您的幫助。 – Kevin 2010-03-19 14:04:36

1

我認爲這是一個「乾淨」的方式來做到這一點。您正按照它應該使用的方式使用ScriptManager。

如果你不喜歡這行代碼的外觀,你總是可以將它重構爲「Script Utility」類或其他東西。我不會,但那只是我。

+0

它似乎只能在每次回發時運行帶有一些隨機密鑰名稱的RegisterStartupScript,並且應該有某種類似RegisterPostbackScript的功能,可以在每次回發後運行腳本 – Kevin 2010-03-17 15:05:59

+0

我不太確定我理解你爲什麼在每一次回傳中給它一個獨特的關鍵。如果您的密鑰每次都一樣,它應該可以正常工作。您所做的只是註冊腳本以進行特定的頁面渲染。除此之外,你按照它應該使用的方式使用它。我同意,它可能不會像最漂亮的代碼行一樣「看起來」,但它完全按照您希望的方式執行:在頁面加載到瀏覽器中時運行客戶端腳本。 – 2010-03-17 15:27:48

+0

如果我在每次回傳時都沒有給它一個唯一的關鍵字名稱,它就會爆炸。 – Kevin 2010-03-17 15:51:00

1

我認爲你正確地做到了這一點。我會擺脫唯一的關鍵。

作爲每MSDN

通過識別與所述鍵的腳本,多個服務器控制實例可以沒有它被髮射到輸出流兩次請求腳本塊。

具有相同關鍵參數值的任何腳本塊都被認爲是重複的。

該鍵用於防止您多次創建腳本,因此您不需要它在您的情況下是唯一的。

相關問題