2015-02-06 105 views
1

我對此有點新,而我的英語也很差。無論如何:如何從後面的代碼刷新一個asp頁面? C#

我想設置一個計時器,刷新我的網頁,如果有任何新的記錄在我的報告。顯然我的計時器工作正常,因爲當我調試它進入功能Timer1_Tick,但它不刷新我的網頁。

下面是代碼:

System.Timers.Timer Timer1 = new System.Timers.Timer(); 
Timer1.Interval = 10000; 
Timer1.Elapsed += Timer1_Tick; 
Timer1.Enabled = true; 

protected void Timer1_Tick(object sender, EventArgs e){ 
    Response.Redirect("ReporteIncidencia.aspx"); //1st attempt 
    ScriptManager.RegisterStartupScript(Page, typeof(Page), "somekey", "RefreshPage()", true); //2nd attempt 
    Page.ClientScript.RegisterStartupScript(this.GetType(), "CallMyFunction", "RefreshPage()", true); //3rd attempt 
} 

<script type="text/javascript"> 
function RefreshPage() 
{ 
    window.location.reload() 
} 
</script> 

編輯:

  1. 我使用.NET框架3.5
  2. 我試過這個post但它不起作用。
  3. 感謝您的回答。
+0

有你在你的應用程序中使用SignalR考慮? – rajeemcariazo 2015-02-06 15:51:30

+1

@rajeemcariazo我不熟悉SignalR,生病看看謝謝 – 2015-02-06 16:02:13

+0

@Izzy我已經試過這個帖子,但沒有任何作品,謝謝 – 2015-02-06 16:02:39

回答

2

我建議您使用Ajax來執行此操作。

但一個簡單的方法來實現,是使用Asp.Net計時器和更新面板組件。

在的.aspx:

<asp:ScriptManager runat="server" id="ScriptManager1"/> 
<asp:UpdatePanel runat="server" id="UpdatePanel1"> 
<ContentTemplate> 
<asp:Timer runat="server" id="Timer1" Interval="10000" OnTick="Timer1_Tick"> 
</asp:Timer> 
<asp:Label runat="server" Text="Page not refreshed yet." id="Label1"> 
</asp:Label> 
</ContentTemplate> 
</asp:UpdatePanel> 

在後面的代碼:

protected void Timer1_Tick(object sender, EventArgs e) 
{ 
    Label1.Text = "Panel refreshed at: " + 
    DateTime.Now.ToLongTimeString(); 
} 

在asp:ScriptManager的成分是必要使用更新面板。更多信息here

+0

我試過了,但它不起作用。 注:我工作在我公司的框架和主頁。我在一個新的.aspx頁面上嘗試了這個例子,它工作='(我應該從我的.aspx? 感謝回答。 – 2015-02-06 16:32:47

+0

什麼意思是「不工作」?Timer_Tick事件至少提出? – 2015-02-06 16:38:20

+0

Yeap ..它甚至沒有提出。 – 2015-02-06 17:01:02

0

這不起作用的原因是,一旦響應從服務器發送到客戶端,服務器就不能再修改響應,因此它不能註冊啓動腳本。您必須記住ASP.NET page lifecycle以及服務器和客戶端之間的區別。

相反,您可以實現一個在JavaScript中運行在客戶端的計時器,如How to reload page every 5 second中所述?

但是,這並不理想,因爲現在您的頁面將再次請求整個頁面的HTML。這是很大的開銷。相反,您應該只刷新所需的數據。我在How to implement real time data for a web page中描述了各種技術,其中討論了UpdatePanel,AJAX輪詢和使用SignalR。注意我特別推薦使用UpdatePanel。他們是棘手和低效的。

+0

我很喜歡你的答案!我可以重新加載我的頁面,每隔一段時間用這段代碼初始化(): ScriptManager.RegisterStartupScript(this,GetType(),「refresh」,「window.setTimeout('window.location.reload(true);' ,20000);「,true);我在公司的框架下工作,所以它給了我建立datagridview的方法,無論如何,我會看看你的帖子。再次感謝。 – 2015-02-06 17:04:41

+0

@ Maverick.pe後面的代碼在發送響應後不再在頁面中扮演任何角色,因此它不能調用客戶端代碼。您需要使用我討論的實時數據技術之一重新考慮您的策略。 – mason 2015-02-06 17:17:01

+0

Yeap ..即時通訊與您討論的其他實時數據技術嘗試。我嘗試UpdatePanel和Ajax輪詢,但它沒有工作,我會嘗試與SignalR =)謝謝。 – 2015-02-06 17:45:24

0

在asp.net提供頁面後,它停止與服務器的通信。在頁面加載完成後,您無法將代碼後面的通知從客戶端推送到客戶端。*

如果你只是想在一段時間後,將用戶重定向,你檢查的時間在客戶端上,如:

C#:

Page.ClientScript.RegisterStartupScript(this.GetType(), "CallMyFunction", "RefreshPage()", true); 

的JavaScript

<script type="text/javascript"> 
function RefreshPage() 
{ 
    setTimeout(function(){ 
     window.location.reload(); 
    }, 10000); 
} 
</script> 

否則,您可以隨時創建從客戶端到服務器的請求。

  • 還有的WebSockets和SSE,例如,但他們都不是最好的解決辦法,如果你只是想用它來刷新頁面
+0

但是這會不時刷新我的網頁,我只需要重新加載,如果在代碼背後=(謝謝 如果我使用此代碼初始化(): ScriptManager.RegisterStartupScript(this,GetType(),「refresh」,「window.setTimeout('window .location.reload(true);',20000);「,true); 其作品,但如果我試圖在Timer1_Tick上使用它..它不起作用。嘆息* – 2015-02-06 16:19:05

+0

@ Maverick.pe然後你必須向服務器發出請求,就像Arthur Castro的回答一樣。在頁面加載完成後你不能發送任何東西給客戶端。除非你使用SignalR(或者它的底層技術,比如websockets,SSE等),否則客戶端和服務器之間的連接會關閉。 – Andre 2015-02-06 16:50:19

+0

我會搜索SignalR,我從來沒有聽說過它。謝謝=) – 2015-02-06 17:16:55