[ASP.NET CausesValidation] 失效的控制項

熟悉 ASP.NET WebForm 的程式開發人員應該都熟悉 CauseValidation 這個屬性,如果沒記錯,在ASP.NET 2.0 之後,在 Button 、TextBox、等控制項均加入了這個屬性。而會寫這一篇文章的主要原因則是因為之前100年擴充案的一個系統發生了一個看似詭異的事情

熟悉 ASP.NET WebForm 的程式開發人員應該都熟悉 CauseValidation 這個屬性,如果沒記錯,在ASP.NET 2.0 之後,在 Button 、TextBox、等控制項均加入了這個屬性。而會寫這一篇文章的主要原因則是因為之前100年擴充案的一個系統發生了一個看似詭異的事情,就是畫面上的所有按鍵(Button) 均沒有作用,點了都毫無反應,不管是頁面的Button或是GridView內的均無作用,一般程式員的直覺有時就會誤以為是USER的IE版本問題,其實不是,是ASP.NET 2.0後加入的一個新的特性。我們先看這個問題的來源。

在一個偶然的情況下,有USER反應畫面無法編輯,可是同是怎麼樣測試也測試不出該問題。

在我實際了解後發現,雖然使用者只反應下方 GridView 的編輯鈕無法編輯,如下畫面:

image

 

但我立刻發現這是 CausesValidation 的問題,為什麼呢?因為不光是 GridView 的按鈕按了無作用,是所有紅色圈圈的按鈕都無作用!而這些紅色圈起來的均是 type="submit" 的按鈕,而且只有在某些USER的單位下面,也就是畫面具有某些資料時會使按鈕無作用。且在開啟網頁原始碼時可以看見,前端 input 項目中的 onclick 方法是使用 WebForm_DoPostBackWithOptions() 包起來的,如下圖:

image

因此,一般來說畫面會執行驗證,一般發生在前一個控制項離開焦點的時候就會觸發,通常滑鼠點至下一個控制項時通常也表示前一個控制項離開了焦點 (Focus),如果這時按下的 Submit 按鈕,當然這時驗證是失敗的,看起來按鈕好像無作用。而這個按鈕又與上方的 Detail 資料的編輯無關,如果一定要將上方資料打完才能來編輯下方的 GridView 的話也不免讓USER 覺得很怪,這時就將 GridView 中的按鈕的 CausesValidation="false" 及可。

其實這是個古老問題了,不過其實有時後人是健忘的,明明知道這個東西,但有時候還會愣在這個畫面上XD... 但是還是有一些程式開發人員並不清楚當中的概念,特此筆記下來,也順便提醒一下自己。

後記:

一般說來,微軟是在 ASP.NET 2.0 之後使用 WebForm_DoPostBackWithOptions() 代替了 __doPostBack() 方法,在這個方法中會檢查目前element的 validation屬性,是不是使用 Client 驗證 ( 呼叫 Page_ClientValidate()),使用IE開發者工具叫出該 WebResource.axd 可找到原始 JavaScript 如下圖,看了之後你就會更清楚它還做什麼事。

image

但也不是所有的按鈕都會使用 WebForm_DoPostBackWithOptions() 方法包起來,一般來講,有底下情形時會出現:

  1. 畫面有使用 Validator 驗證控制項
  2. 按鈕有設訂 PostBackUrl 屬性
  3. 按鈕使用預設的 CausesValidation 設定值時 (因為預設="True")

一個簡短的分享。相信許多人也都清楚。我們下次見 :)


 

簽名:

學習是一趟奇妙的旅程

這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。

軟體開發之路(FB 社團)https://www.facebook.com/groups/361804473860062/

Gelis 程式設計訓練營(粉絲團)https://www.facebook.com/gelis.dev.learning/


 

如果文章對您有用,幫我點一下讚,或是點一下『我要推薦,這會讓我更有動力的為各位讀者撰寫下一篇文章。

非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^