第6章 資料驗證、HTTP物件與錯誤處理 6-1 資料驗證的基礎 6-2 基本驗證控制項 6-3 進階驗證控制項 6-4 ASP.NET的HTTP物件 6-5 ASP.NET的錯誤處理
6-1 資料驗證的基礎 6-1-1 ASP.NET驗證控制項 6-1-2 伺服端或客戶端的資料驗證
6-1-1 ASP.NET驗證控制項-說明 ASP.NET提供「驗證控制項」(Validation Controls)可以自動建立伺服端或客戶端的資料驗證功能,幫助我們執行Web表單欄位資料的驗證。 驗證控制項單獨存在並沒有意義,需要將驗證控制項和輸入或選擇控制項結合起來,才能執行指定控制項的資料驗證。 多個驗證控制項可以同時針對一個資料輸入控制項進行資料驗證。
6-1-1 ASP.NET驗證控制項-種類1 ASP.NET提供五種驗證控制項,如下表所示:
6-1-1 ASP.NET驗證控制項-種類2 除了上述驗證控制項外,還提供ValidationSummary控制項,可以顯示整個Web表單的驗證錯誤訊息,如下表所示:
6-1-1 ASP.NET驗證控制項-在Visual Studio Community建立驗證控制項 按二下控制項或以拖拉方式,即可在Web Form表單新增驗證控制項
6-1-1 ASP.NET驗證控制項-共通屬性 在ASP.NET的各種驗證控制項都擁有一些共通屬性,常用的共通屬性說明,如下表所示:
6-1-2 伺服端或客戶端的資料驗證- 說明 ASP.NET驗證控制項可以使用EnableClientScript屬性來決定是否自動建立客戶端資料驗證的Jscript程式碼,或只能使用伺服端資料驗證,其說明如下所示: 客戶端資料驗證(Client-Side Validation):尚未送到伺服端前,在客戶端瀏覽器進行檢查,即使用Jscript程式碼執行資料檢查。 伺服端資料驗證(Server-Side Validation):伺服端資料驗證是在資料送到伺服端後,才進行資料檢查。
6-1-2 伺服端或客戶端的資料驗證- Page物件的IsValid屬性 當在Web表單加入驗證控制項後,ASP.NET網頁可以使用Page物件的IsValid屬性來確認表單是否通過驗證,如下所示: if (Page.IsValid) { …… } 上述if條件在確認IsValid屬性為true時,就表示通過驗證,接著就可以執行Web表單的處理。
6-1-2 伺服端或客戶端的資料驗證- Button控制項的CausesValidation屬性 Button控制項的CausesValidation屬性可以決定Web 表單是否執行驗證控制項的資料驗證,如果屬性值為False,表示當表單送回時,忽略驗證控制項的資料驗證;預設值True是需要執行資料驗證。
6-1-2 伺服端或客戶端的資料驗證- UnobtrusiveValidationMode驗證模式 .NET Framework 4.5之後版本預設啟用UnobtrusiveValidationMode模式,使用jQuery函數庫執行客戶端資料驗證,因為沒有安裝jQuery函數庫,需要取消此模式才能正確執行ASP.NET驗證控制項。 請開啟ASP.NET網站,在「方案總管」視窗開啟Web.config檔案,在<configuration>根元素中加入<appSettings>子標籤,如下所示: <appSettings> <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" /> </appSettings>
6-2 基本驗證控制項 6-2-1 RequiredFieldValidator控制項 6-2-2 CompareValidator控制項 6-2-3 RangeValidator控制項 6-2-4 ValidationSummary控制項
6-2-1 RequiredFieldValidator控制項-說明 RequireFieldValidator
6-2-1 RequiredFieldValidator控制項-範例網站 ASP.NET網站:Ch6_2_1 在ASP.NET網頁建立登入表單,使用TextBox控制項輸入使用者名稱和密碼,並且使用RequiredFieldValidator控制項檢查欄位資料,如下圖所示:
6-2-2 CompareValidator控制項-說明
6-2-2 CompareValidator控制項-屬性1 控制項除了共同屬性外的相關屬性說明,如下表所示:
6-2-2 CompareValidator控制項-Operator屬性
6-2-2 CompareValidator控制項-範例網站 ASP.NET網站:Ch6_2_2 在ASP.NET網頁新增3個TextBox控制項後,使用2個CompareValidator控制項檢查2次輸入的密碼是否相同,和數量一定需要大於等於1,如下圖所示: 密碼一定要輸入,才會比較是否相同
6-2-3 RangeValidator控制項-說明
6-2-3 RangeValidator控制項-屬性 控制項除了共通屬性外的相關屬性說明,如下表所示:
6-2-3 RangeValidator控制項-範例網站 ASP.NET網站:Ch6_2_3 在ASP.NET網頁新增TextBox控制項輸入成績後,使用RangeValidator控制項檢查成績範圍是否是在0~100之間,如下圖所示:
6-2-4 ValidationSummary控制項-說明
6-2-4 ValidationSummary控制項-範例網站 ASP.NET網站:Ch6_2_4 在ASP.NET網頁建立網站註冊表單輸入使用者名稱和2次密碼,欄位使用RequiredFieldValidator和CompareValidator控制項執行資料驗證,最後使用ValidationSummary控制項顯示驗證錯誤的摘要資訊,如右圖所示: 密碼一定要輸入,才會比較是否相同 ValidationSummary
6-3 進階驗證控制項 6-3-1 RegularExpressionValidator控制項 6-3-2 CustomValidator控制項
6-3-1 RegularExpressionValidator控制項- 說明與屬性
6-3-1 RegularExpressionValidator控制項- 正規運算式的基礎 在正規運算式的範本字串是由字面值(Literals,即字串常數)和萬用字元所組成,其中的字元擁有特殊的意義,屬於一種小型的字串比對語言,正規運算式引擎能夠將定義的正規運算式和字串進行比較,引擎傳回布林值,True表示字串符合範本字串的定義;False表示不符合。
6-3-1 RegularExpressionValidator控制項- 字元集(說明) 正規運算式範本字串的字面值是由英文字母、數字和一些特殊字元所組成,如果字面值的字元是有特殊意義的字元時,我們需要使用「\」符號來指明是字面值,例如:「.」的字面值需要使用「\.」來表示。
6-3-1 RegularExpressionValidator控制項- 字元集(種類) 字面值還可以使用「[」和「]」符號組合成一組字元集,每一個字元集代表字串中的字元需要符合的條件。
6-3-1 RegularExpressionValidator控制項- 字元集(Escape字串)
6-3-1 RegularExpressionValidator控制項-萬用字元 正規運算式的範本字串除了前述的字元集外,還可以加上萬用字元來定義比對的方式、出現位置和次數。常用的萬用字元如下表所示:
6-3-1 RegularExpressionValidator控制項- 常用的範本字串
6-3-1 RegularExpressionValidator控制項-範例網站 ASP.NET網站:Ch6_3_1 在ASP.NET網頁新增TextBox控制項輸入電子郵件地址,使用RegularExpressionValidator控制項檢查電子郵件格式是否正確,RequiredFieldValidator控制項檢查是否有輸入郵件地址,如下圖所示: 預計進度 (2016/12/23)
6-3-2 CustomValidator控制項-說明
6-3-2 CustomValidator控制項-屬性 控制項除了共通屬性外的相關屬性說明,如下表所示: CustomValidator控制項的相關事件說明,如下表所示:
6-3-2 CustomValidator控制項-事件處理程序 例如:當ServerValidator事件觸發後,就執行事件處理程序來檢查使用者名稱的字串,如下所示: protected void validCustom_ServerValidate(object source, ServerValidateEventArgs args) { if (args.Value.StartsWith("_")) args.IsValid = false; else args.IsValid = true; }
6-3-2 CustomValidator控制項-範例網站 ASP.NET網站:Ch6_3_2 在ASP.NET網頁新增TextBox控制項輸入使用者名稱後,使用CustomValidator控制項撰寫程序來檢查使用名稱不能是「_」底線開頭,如下圖所示:
6-4 ASP.NET的HTTP物件 6-4-1 Response物件 6-4-2 Request物件 6-4-3 Server物件
6-4 ASP.NET的HTTP物件 ASP.NET的Response、Request、Server、Application和Session物件都有對應.NET Framework的類別,這些都是以Http字頭開始的類別,筆者在本書稱為HTTP物件。 在這一節筆者將說明Response、Request和Server物件的常用方法和屬性,關於Application和Session物件的說明請參閱第7章。
6-4-1 Response物件- Response.Write()方法 Response.Write()方法可以在ASP.NET網頁將資料輸出到瀏覽器顯示,輸出內容可以是字串、HTML標籤或變數,如下所示: Response.Write(title + "<br/>"); Response.Write("歡迎使用ASP.NET程式設計<br/>"); 上述程式碼分別輸出變數和字串,而且在輸出字串內含有HTML標籤。
6-4-1 Response物件-Response.Redirect()方法 Response.Redirect()方法可以將網頁轉址到其他URL網址或ASP.NET網頁,如下所示: Response.Redirect("http://www.flag.com.tw"); 上述程式碼可以轉址至旗標出版公司的網站。
6-4-1 Response物件-範例網站 ASP.NET網站:Ch6_4_1 在ASP.NET網頁的TextBox控制項輸入網址,按下按鈕,就可以轉址至到其他URL網址或ASP.NET網頁,如下圖所示: 注意: “http:// 一定要輸入
6-4-2 Request物件-取得伺服器的系統資訊(說明) HTTP通訊協定傳送的資料不只有網址,在HTTP標頭資訊還提供瀏覽器版本、時間等環境變數和表單欄位資料,在這一節將說明如何取得一些常用的環境變數。 伺服器的系統資訊可以使用Request物件的ServerVariables屬性來取得,這是一個集合物件,以參數的Server變數字串來取得系統資訊。
6-4-2 Request物件-取得伺服器的系統資訊(常用Server變數)
6-4-2 Request物件-取得伺服器的系統資訊(範例) 在ASP.NET網頁可以使用Request物件的ServerVariables屬性取得指定的系統資訊,如下所示: IPAddress = Request.ServerVariables["REMOTE_ADDR"]; path = Request.ServerVariables["PATH_INFO"]; 上述程式碼參數是Server變數的環境變數名稱字串,可以取得指定環境變數的值,以此例為使用者IP位址和目前ASP.NET網頁的虛擬路徑。 http://120.126.19.159/sample/
6-4-2 Request物件- 瀏覽器的相關資訊(說明) 客戶端瀏覽器在連線Web伺服器時,「HTTP使用者代理人標頭」(HTTP User Agent Header)資訊會傳送給伺服器,在此標頭資訊包含瀏覽器的相關資訊。 在ASP.NET網頁可以使用Request物件的Browser屬性取得這些資訊,如下所示: HttpBrowserCapabilities hbc = Request.Browser; 上述程式碼在取得HttpBrowserCapabilities物件後,就可以使用相關屬性取得瀏覽器支援的功能。
6-4-2 Request物件-瀏覽器的相關資訊(屬性)
6-4-2 Request物件-範例網站 ASP.NET網站:Ch6_4_2 在ASP.NET網頁的TextBox控制項輸入Server變數字串,按下按鈕可以顯示環境變數值,按【瀏覽器】鈕可以顯示瀏覽器的相關資訊,如下圖所示:
6-4-3 Server物件-Server.MapPath()方法 如果想取得目前執行ASP.NET網頁的虛擬目錄,請使用ServerVariables集合物件的PATH_INFO參數取得ASP.NET檔案的虛擬路徑,然後配合Server.MapPath()方法轉換成實際路徑,如下所示: path = Server.MapPath( Request.ServerVariables["PATH_INFO"]); 如果是指定的ASP.NET網頁或檔案的實際路徑,如下所示: path = Server.MapPath("Default.aspx");
6-4-3 Server物件-Server.Transfer()方法 Server.Transfer()方法是用來取代Response.Redirect()方法執行轉址功能,Redirect()方法浪費較多頻寬在瀏覽器和伺服器之間的通訊,Transfer()方法的轉址操作完全在伺服端完成,並不會浪費頻寬,其使用方式和Redirect()方法幾乎完全相同,如下所示: Server.Transfer("http://www.hinet.net"); Check 是否有問題?
6-5 ASP.NET的錯誤處理 6-5-1 偵錯模式 6-5-2 例外處理
6-5-1 偵錯模式-說明 在ASP.NET網頁如果是單純的語法錯誤,在編譯階段,原始程式錯誤(Source Error)區塊就會指出錯誤產生的程式碼行列號,和顯示產生錯誤的程式碼。 如果ASP.NET網頁是在伺服端執行時才發生錯誤,我們可以開啟偵錯模式來顯示進一步的錯誤資訊。 紅色字指出產生錯誤的程式碼行列號
6-5-1 偵錯模式-開啟 ASP.NET 4.6版預設啟用偵錯模式,如果是4.5版,在下方原始程式錯誤區段並不會顯示紅色造成錯誤的程式碼列,我們需要自行啟用ASP.NET的「偵錯模式」(Debug Mode),如下圖所示:
6-5-2 例外處理-語法 C#語言的例外處理程式敘述,如下所示: try { // 測試的錯誤程式碼 … } catch (Exception ex) { // 錯誤處理的程式碼 finally {
選擇性的程式區塊,不論錯誤是否產生,都會執行此區塊的程式碼,通常是用來作為善後的程式碼 6-5-2 例外處理-說明 例外處理敘述分成三個部分,其說明如下表所示: 程式區塊 說明 try 在try程式區塊是需要錯誤處理的程式碼 catch 如果try程式區塊的程式碼發生錯誤,在catch程式區塊會傳入參數ex的Exception例外物件,可以使用ex.ToString()方法顯示錯誤資訊,或建立錯誤處理的補救程式碼 finally 選擇性的程式區塊,不論錯誤是否產生,都會執行此區塊的程式碼,通常是用來作為善後的程式碼
6-5-2 例外處理-範例網站 ASP.NET網站:Ch6_5_2 在ASP.NET網頁建立try/catch/finally例外處理敘述,可以處理除以0的程式錯誤,如下圖所示: 預計進度 (2016/12/28, 星期三)