[ASP.NET] Button Disabled and Postback

  • 14944
  • 0
  • 2011-11-11

來自前端的一個小需求,使用者希望在Button Click後,能先Disabled起來,並且做文字上的替換

來自前端的一個小需求,使用者希望在Button Click後,能先Disabled起來,並且做文字上的替換,

之前也曾在討論區中看到類似的提問,處理方法不困難,不過觀念上卻容易出錯

 

例如可能會直覺想在Button_ Click給予下列的Code

 

protected void Button_Save1_Click(object sender, EventArgs e)

{

         this.Button_Save.Text = "計算中...";

         this.Button_Save.Enabled = false;

         //Do some thing

}

 

然這樣的做法是無法達到的,原因在於ASP.NET 網頁週期,上述的寫法最終的結果會是必須等Command做完

,Reload Page時Button的改變才會有效果

 

其實這樣的需求,可以直接借由前端的Javascript就可以搞定,在Button本身註冊onclick的javascript

在使用者click button時即改變對Text及Style,程式碼如下

 

this.Button_Save.Attributes.Add("onclick", "this.value='計算中...';this.disabled=true;");

 

不過這樣的做法卻有個小小的問題,就是Button一旦是Disabled後,其後續Submit的動作是不會運作的

換句話Server Side的Button_Save1_Click並不會被執行,為何會如此呢?

首先我們來看一下Button Control在前端Load成Html時預設type會是Submit

也就說類似ASP時代的form submit,至此可以回想一下原始的需求在asp時代,會怎樣做?

通常會是call一段javascript function把button style改變後,接著給與form.submit()對吧!

 

<script type="text/javascript">
function submitform()
{
 //do button style change
  document.myform.submit();
}
</script> 

 

同理的我們也必須做類似的事情,先來看一下Button Control的UseSubmitBehavior屬性,預設情況會是true

首先拉二個Button,其中一個UseSubmitBehavior屬性改為false,接著來看前端Load成Html時有什麼變化

image

 

UseSubmitBehavior屬性改為false的Button,會產生一個 _doPostBack的onclick javascript function,寫ASP.NET的應該不陌生吧

是的它就是大部份ASP.NET Web Control進行postback時所觸發的Function

而另一個預設的button則是type=submit,以form submit的機制運形

 

至此我們可以利此一特性,以下列二種方式達成所需

1.

將上述原先所寫的

this.Button_Save.Attributes.Add("onclick", "this.value='計算中...';this.disabled=true;");


進一步改成

 

this.Button_Save.Attributes.Add("onclick", "this.value='計算中...';this.disabled=true;" + ClientScript.GetPostBackEventReference(Button_Calculate, "").ToString());

即可達到在Click後Button給Disabled起來,並且postback依然正常運作

 

2.

上述原先所寫的

 

this.Button_Save.Attributes.Add("onclick", "this.value='計算中...';this.disabled=true;");

保持不變,但Button的UseSubmitBehavior屬性改為false

 

效果呈現如下

image

 

[註]:

1.本範例說明,並無法完全防止重覆Submit,因為使用者依然可以利用F5進行重覆Submit的動作

若要完全解決這個問題,可以Google一下,站內有不少專家都有提出一些做法,可參考

 

2.實際案例,程式還是必須做一些輸入的驗證判斷,最後才決定是否進行Submit or PostBack動作,當然若是您是Clinet side的檢查

,那麼當然您必須確認已通過檢查,再做_dopostback的呼叫

 

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18