asp.net web form的驗證控制項(Validator)


初學asp.net web form框架,讀到page的生命週期,看到有個階段是「驗證」。

想起之前在寫ajax時,明明很多輸入的檢查都是在client,這樣速度快多了,對於server端也比較省資源吧,不必再吃一次上傳下載的request。

睡前想到的問題是:
驗證階段為什麼不寫個javascript,直接在clinet端就做驗證,不要等到postback後才server端驗證,這樣該次postback只驗證了某些欄位輸入失敗這樣?
是因為會怕javascript在瀏覽器執行的時候,有時候會執行失敗(或是直接關閉瀏覽器執行javascript的功能),導致錯誤的值會被傳到server,然後把這些值塞到資料庫之類的導致錯誤,這大概是我暫時想到的原因吧,但這樣很吃頻寬還有瀏覽器執行的效能阿。

查了一下網路資料,自己試著回答一下這個問題。
這個機制還有個功能就是可以驗證跟資料庫有關的資訊,像是庫存數量等,這些訊息在client並沒有,所以要回server做驗證。(但後來想想,其實自己寫javascript做AJAX也能做到阿,不過asp.net框架內沒有提供寫好的元件這樣搞就是了。)

這當中還牽扯到一個資安的議題:
如果對於資料嚴謹度的要求很高,最好不要太相信client端傳來的資料;也就是說,最好都要在server端有個檢查的判斷。(特別是那些要寫入資料庫的資料!!!)

另外「使用驗証控制項有個好處,至少可以利用ValidationSummary的訊息視窗統一顯示錯誤訊息,不需要多寫額外的程式碼。」等於是如果用框架提供的東西,就可省很多事,問題是有些是框架做不到的事情,彈性就比較低;自己還是要懂原本的機制,才有辦法修改更多的東西。

asp.net web form框架有提供驗証控制項(Vilidator),有提供client-side 跟 server-side的validation ,這樣才比較合理XD
是我原本太菜,想到的菜鳥問題,人家Microsoft框架其實早就有想到了,並且提供一個簡便的方式。

這些驗證控制項有個EnableClientScript屬性,預設是true,可針對驗証控制項選擇驗証位置是要在client端或是server端。在client驗証可以立即回應驗証成功與否,無需PostBack後才進行判斷驗證,相對地減少了對server端的負載。

由此可見,在框架之下,不用自己刻兩遍同樣的邏輯在client端的javascript跟server端的C#或VB,框架用屬性的設定,在後續Rendering階段自動幫忙生成對應的原始碼。



留言

  1. 自動化的缺點是會產生很多不必要的代碼,單純一個是否空白的驗證,以前端來說 jQuery 只要2 , 3 行的代碼,而控制項卻自動生成數十行代碼 (還包括隱藏欄位),可想而知,如果你表單的欄位很多,你的 HTML 被汙染的程度會超出你的想像。

    回覆刪除

張貼留言

這個網誌中的熱門文章

API、Method和Library是什麼東西和關係?

《人月神話》簡易心得

Asp.net的網頁生命週期