2011-06-21 100 views
6

我想有兩件事情發生時,我在ASP.NET頁面點擊一個按鈕:更新ASP.NET標籤按鈕點擊後,使用的UpdatePanel

  1. 變化的ASP文本:標籤。
  2. 禁用按鈕。

我在這方面做了大量的研究,但是我也遇到過困難。

#1,我認爲這應該工作,但它並不:

<%@ Page Language="VB" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<script runat="server"> 


    Protected Sub BtnSubmit_Click(sender As Object, e As System.EventArgs) 
     Label1.Text = "Working..." 

     System.Threading.Thread.Sleep(5000) 

     Label1.Text = "Done." 

    End Sub 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Test Page</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <ajaxToolkit:ToolkitScriptManager runat="server" /> 
    <div> 
     <asp:ListBox runat="server" Height="100px" /> 
     <br /> 
     <asp:UpdatePanel runat="server"> 
      <Triggers> 
       <asp:AsyncPostBackTrigger ControlID="BtnSubmit" EventName="Click" /> 
      </Triggers> 
      <ContentTemplate> 
       <asp:Label ID="Label1" runat="server" Text="Press the button" /> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
     <br /> 
     <asp:Button runat="server" ID="BtnSubmit" OnClick="BtnSubmit_Click" Text="Submit Me!" /> 
    </div> 
    </form> 
</body> 
</html> 

「工作...」 消息永遠不會顯示。

至於#2,我已將此添加按鈕(我忘了,我發現它):

OnClientClick="this.disabled = true; this.value = 'Working...';" 
      UseSubmitBehavior="false" 

這不得不禁用按鈕,改變它的文本(值)的預期效果,但它無法使用文本和啓用屬性將其更改回來。

回答

0

即使您使用UpdatePanel,ASP也不會將結果刷新到瀏覽器。它會在沖洗前完成作業(包括睡眠)。

您可以使用UpdateProgress顯示「正在工作」文本。

<asp:UpdateProgress> 

這將在UpdatePanel工作時顯示其內容。一旦UpdatePanel完成,內容將消失。

你需要什麼你ClickEvent是:

Label1.Text = "Done." 
btnSubmit.Enabled = false 

這將顯示完成文本和禁用按鈕。並告訴UpdateProgress消失。

-1

首先,「工作」從不出現,因爲後貼時間標籤的最終值是「完成」。想想這裏發生了什麼 - 您單擊導致回發到服務器的按鈕。它處理包括運行按鈕點擊代碼的回傳,其結果然後被髮送回瀏覽器。你的'工作'文本永遠不會讓它回到電線上。

我不是你想與客戶端的代碼來完成什麼明確的,而是做你描述你在做什麼almsot有服務器端:

Protected Sub BtnSubmit_Click(sender As Object, e As System.EventArgs) 
    Label1.Text = "Done." 
    btnSubmit.Enabled = false 
End Sub 

還可以,但你的按鈕在您的更新面板模板標籤內,以便它參與ajax回發。

0

工作消息從不顯示,因爲您正在服務器上執行腳本,該腳本在方法退出之前不響應客戶端。

ASP.NET AJAX有一個內置控件,用於在UpdatePanel在服務器上等待時顯示像這樣的消息。

退房UpdateProgress控件:

<asp:UpdateProgress runat="server" id="progress" ><ProgressTemplate>Working...</ProgressTemplate></asp:UpdateProgress> 

您可以通過設置Enabled屬性設置爲false在您的服務器端方法禁用按鈕。

BtnSubmit.Enabled = false 
+0

完美。我有點尷尬,我沒有找到這個。感謝你和其他人爲你的時間。 – rht341

0

@ 1:當您停止線程時,您將永遠看不到消息「正在工作」。當您的進程「結束」時,每條消息都將顯示。

@ 2:你編碼的客戶方禁用按鈕,沒有代碼來重新啓用按鈕

心連心

5

我只是發現在MSDN(http://msdn.microsoft.com/en-us/library/bb386518.aspx)的解決方案增加了一些代碼,並刪除一些。不必要的部分。

<%@ Page Language="C#" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<script runat="server"> 
protected void btnDoWork_Click(object sender, EventArgs e) 
{ 
    /// do something long lasting 
    System.Threading.Thread.Sleep(3000); 
} 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head1" runat="server"> 
<title></title> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div> 
    <asp:ScriptManager ID="ScriptManager1" runat="server" /> 

    <script language="javascript" type="text/javascript"> 
    <!-- 
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_initializeRequest(InitializeRequest); 
    prm.add_endRequest(EndRequest); 
    var postBackElement; 
    function InitializeRequest(sender, args) { 
     if (prm.get_isInAsyncPostBack()) { 
      args.set_cancel(true); 
     } 
     postBackElement = args.get_postBackElement(); 
     if (postBackElement.id == 'btnDoWork') { 
      $get('btnDoWork').value = 'Working ...'; 
      $get('btnDoWork').disabled = true; 
     } 
    } 
    function EndRequest(sender, args) { 
     if (postBackElement.id == 'btnDoWork') { 
      $get('btnDoWork').value = 'Done!'; 
      $get('btnDoWork').disabled = false; 
     } 
    } 
    // --> 
    </script> 

    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:Label ID="Label1" runat="server" Text="Hello World!"></asp:Label><br /> 
     </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="btnDoWork" /> 
     </Triggers> 
    </asp:UpdatePanel> 
    <asp:Button ID="btnDoWork" runat="server" Text="Start!" OnClick="btnDoWork_Click" /> 
</div> 
</form> 
</body> 
</html> 

你基本上做什麼,是你註冊一些事件處理程序爲Initialize_END_REQUEST - 在那些你禁用並啓用你的按鈕!

HTH

+0

謝謝先生,正是我想要的。 – rht341

+0

你可能會考慮將這個問題標記爲提前回答 - thx:D –