2009-05-22 56 views
6

我知道我可以掛接到客戶端事件以在每次部分回發後運行JavaScript;然而,我想要做這樣的事情:如何控制在UpdatePanel部分回發endRequest後運行哪個JavaScript?

protected void FooClicked(object sender, EventArgs e) { 
     ClientScript.RegisterStartupScript(GetType(), "msg", "showMsg('Foo clicked');",true);   
} 

我知道我可以以類似的方式與隱藏字段完全破解它並後運行這是每一個回傳,但應該有一個漂亮的straightfoward方式來這個。

回答

9

由於ClientScript.RegisterStartupScript()在請求生命週期的輸出構建階段將JS寫入頁面,因此您描述的特定代碼示例不適用於部分後處理;而部分回發僅通過JavaScript更新頁面的選定部分(即使服務器上生成了整個頁面的標記(包括啓動腳本))。

密切模仿你所描述的,你應該包括你的UpdatePanel內立即控制,和部分回發期間設置的內容面板到腳本的Text屬性要運行:

myLiteral.Text = "<script type=\"JavaScript\">doStuff();</script>"; 

IMO,更合適的方式是使用client-side API for async postbacks註冊一個事件處理程序,當回發完成運行:

function endRequestHandler(sender, args) { 
    doStuff(); 
} 

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler); 

如果你需要傳遞這是回發到處理過程中產生的信息,您可以傳遞通過隱藏字段並從客戶端處理程序中的DOM中獲取。

+0

@Rex我正在計劃使用隱藏字段和事件處理程序,它們始終都是文件,但是在那裏跳轉的機制與我描述的類似。從我迄今發現的情況來看,這是唯一的選擇。 – Mark 2009-05-24 22:50:10

2

This是更優雅,IMO。顯然ASP AJAX將調用任何名爲pageLoad的JS函數。所以編寫一個名爲pageLoad的函數,即使在部分更新之後,它也會在每次頁面加載時執行。

1

<script type="text/javascript" language="javascript"> 
    function ValidateUserRole() { 
     var answer = confirm("Are you sure..................") 
     if (answer) { 
      var btnRoleReleatedButton = '<%=btnRoleReleatedButton.ClientID%>'; 
      document.getElementById(btnRoleReleatedButton).click(); 
     } 
     else { 
      return false; 
     } 
    } 
</script> 

Tier 3 :<asp:UpdatePanel ID="upTier3Details" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:DropDownList ID="ddlTier3" runat="server" CssClass="ddlextralarge" Width="350" /> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="ddlUserRole" EventName="SelectedIndexChanged" /> 
    </Triggers> 
</asp:UpdatePanel> 

相關問題