2009-09-03 127 views
1

我有一個WebPage,我必須檢測並阻止使用瀏覽器刷新按鈕。 (現在請,不建議我Response.Redirect,我不能在這種情況下使用它)。如何停止觸發事件+ ASP.NET

看這個網頁http://aspalliance.com/687_Preventing_Duplicate_Record_Insertion_on_Page_Refresh.4我找到了方法。我打算將這個想法放在Control中,並將控件放在每一頁上。

現在我的頁面包含如此多的按鈕和其他控件。我的擔憂是,如果是刷新帖子...我不想讓任何事件被炒魷魚......

這將是繁瑣的去檢​​查它是否是每個事件開始時的刷新帖子,因爲我的整個應用程序幾乎建成。

任何想法,可以幫助我。

  • 拉賈

包括下面的文字更加清晰的緣故

大家好,我希望有點誤會......我不想阻止用戶按下刷新按鈕.. 。但我只想調整我的應用程序的響應......想象一下,當用戶單擊BUTTON-A時,會彈出一個窗口並打開另一個頁面。現在,當用戶回來並單擊主窗口中的刷新按鈕時,BUTTON-A的單擊事件再次被觸發並且彈出窗口再次被打開。在這種情況下,我想刷新頁面,而不打開彈出窗口。所以,我需要停止ASP.NET發起BUTTON-A(或任何其他類似按鈕)的單擊事件

回答

3

這至少是你如何做到這一點的起點。我不確定所有的邏輯是100%,但它是開始...

protected void Page_Load(object sender, EventArgs e) 
{ 
    foreach (Control control in Controls) 
    { 
     DisableEvent(control); 
    } 
} 
protected void Page_PreRender(object sender, EventArgs e) 
{ 
    foreach (Control control in Controls) 
    { 
     UpdateViewstate(control); 
    } 
} 
private void DisableEvent(Control current) 
{ 
    foreach (Control control in current.Controls) 
    { 
     if (control.GetType() == typeof(Button)) 
     { 
      if (IsPostBack) 
      { 
       if (Session["update" + control.ID].ToString() != ViewState["update" + control.ID].ToString()) 
       { 
        RemoveClickEvent((Button)control); 
       } 
       else 
       { 
        ((Button)control).Click += new EventHandler(Button_Disable); 
       } 
      } 
      else 
      { 
       Session["update" + control.ID] = Server.UrlEncode(System.DateTime.Now.ToString()); 
      } 
     } 
     DisableEvent(control); 
    } 
} 
private void UpdateViewstate(Control current) 
{ 
    foreach (Control control in current.Controls) 
    { 
     if (control.GetType() == typeof(Button)) 
     { 
      ViewState["update" + control.ID] = Session["update" + control.ID]; 
     } 
     UpdateViewstate(control); 
    } 
} 

void RemoveClickEvent(Button b) { 
    System.Reflection.FieldInfo f1 = typeof(Button).GetField("EventClick", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 
    object obj = f1.GetValue(b); 
    System.Reflection.PropertyInfo pi = typeof(Button).GetProperty("Events", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
    System.ComponentModel.EventHandlerList list = (System.ComponentModel.EventHandlerList)pi.GetValue(b, null); 
    list.RemoveHandler(obj, list[obj]); 
} 

protected void Button_Disable(object sender, EventArgs e) 
{ 
    Button b = (Button)sender; 
    Session["update" + b.ID] = Server.UrlEncode(System.DateTime.Now.ToString()); 
} 
4

我知道你不想聽到這個,但用戶希望能夠擊中刷新按鈕。打破他們喜歡的東西會使他們不高興。他們會責怪你,你的名字會變成泥巴。

想想那些試圖阻止Back按鈕的網站:你喜歡它們嗎?

+0

我明白...但在這個頁面,我自己提供了一個刷新按鈕,用戶可以使用刷新內容...我想阻止按鈕點擊和其他事件再次被解僱。 – 2009-09-03 08:17:36

+1

@The King--你自己的刷新按鈕與內置於瀏覽器中的刷新按鈕有什麼關係? – RichardOD 2009-09-03 08:51:02

+1

我自己的刷新按鈕只是重新加載頁面,並且不會再次觸發最後一個控件事件。 – 2009-09-03 09:51:17

1

您不能阻止用戶按下刷新按鈕。它構建在瀏覽器的功能中,重新發送之前的請求,獲取或發佈。它就在那裏。

這就是爲什麼您通常在發佈後獲得重定向(例如,用戶發佈到用戶/ 1 /編輯和響應重定向到用戶/ 1 /視圖),以便刷新不會導致雙重帖子。

我很抱歉,這不是您想要聽到的內容,但是在製作Web應用程序時,您應該嘗試遵循Web標準並讓用戶能夠使用他/她期望的瀏覽器功能:返回,轉發和刷新。我知道你的應用程序已經快完成了。

但是,如果您開始創建黑客來防止刷新,或者其他不利用技術流動的東西,但是逆流而上,您的應用程序將開始攜帶一個錯誤的軟件包,並且隨着應用程序的運行並且延長了,這個不好的方案將會成爲進一步發展的一個負擔。

+1

嗨皮特,我希望有點誤解...我不想停止用戶按下刷新按鈕...但我想要的是相應地調整我的應用程序的響應...想象一下,當用戶單擊按鈕時,一個場景彈出窗口打開另一個頁面。現在,當用戶回來並單擊主窗口中的刷新按鈕時,BUTTON-A的單擊事件再次被觸發並且彈出窗口再次被打開。在這種情況下,我想刷新頁面,而不打開彈出窗口。所以,我需要停止ASP.NET觸發BUTTON-A(或其他類似按鈕)的點擊事件 – 2009-09-03 09:56:07

+2

在這種特殊情況下,我會將JavaScript直接作爲事件處理程序打開新窗口,即不使其成爲服務器控制。聽起來你是在放置一個服務器控件,並在事件處理程序中插入一個javascript來重新打開一個新頁面?這種特殊情況應該永遠不會是回發 – Pete 2009-09-03 10:29:47

+0

通過「我會把JavaScript直接打開新窗口作爲按鈕的事件處理程序」我的意思是客戶端JavaScript事件處理程序 – Pete 2009-09-03 10:30:28

相關問題