明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

深入講解 ASP+ 驗證(二)

[摘要]服務器端的驗證序列 了解頁面的有效期非常重要。如果習慣于在 Visual Basic 或類似功能齊全的客戶機工具中處理表單,則需要花一定的時間來了解。頁面和頁面上的所有對象并非在與用戶交互時一直有效...
服務器端的驗證序列

了解頁面的有效期非常重要。如果習慣于在 Visual Basic 或類似功能齊全的客戶機工具中處理表單,則需要花一定的時間來了解。頁面和頁面上的所有對象并非在與用戶交互時一直有效,盡管有時表面上是這樣。

以下是在第一次訪問某個頁面時一個簡化的事件序列:

基于 ASPX 文件創(chuàng)建頁面及其控件。
觸發(fā) Page_Load 事件。
頁面和控件屬性保存在一個隱藏字段中。
頁面和控件轉換到 HTML。
丟棄所有內容。
現在,當用戶單擊某個按鈕或類似控件時,將返回服務器,然后執(zhí)行一個類似的事件序列。該序列稱為返回序列:

基于 ASPX 文件創(chuàng)建頁面及其控件。
從隱藏字段恢復頁面和控件屬性。
根據用戶輸入更新頁面控件。
觸發(fā) Page_Load 事件。
觸發(fā)更改通知事件。
頁面和控件屬性保存在一個隱藏字段中。
頁面和控件轉換到 HTML。
再次丟棄所有內容。
我們?yōu)槭裁床粚⑺袑ο蟊A粼趦却嬷心?因為使?ASP+ 建立的 Web 站點無法處理數量非常大的用戶。因此,服務器的內存中只保留馬上要處理的內容。

何時進行服務器端驗證?在第一次獲取頁面信息時,根本不會進行服務器端驗證。大多數最終用戶都非常認真,我們允許用戶自己確認在表單中填寫的信息是否正確,然后我們再使用紅色的文字通知用戶填錯的信息。

在返回事件序列中,第 3 步和第 4 步之間會進行驗證。也就是說,進行驗證是在來自用戶的數據裝回控件屬性后,但在大多數代碼執(zhí)行之前。這意味著在編寫用戶事件代碼時,通?梢岳靡呀涍M行的驗證。一般情況下,您都會希望這樣做。

在該時刻進行驗證的缺點是:如果您要通過編程來修改某些影響該驗證的屬性,該時刻就太遲了。例如,您會發(fā)現,如果通過編寫代碼來啟用或禁用驗證控件或更改驗證控件的屬性,在下一次處理該頁之前,不會看到任何影響。通過以下兩種方法可以避免這個問題:

在進行驗證之前修改屬性。
在屬性更改之后重新驗證控件。
這兩種方法均需要使用在 Page 對象上有效的驗證屬性和方法。

頁面 API

Page 對象包含一些與服務器端驗證有關的重要屬性和方法。表 1 中總結了這些屬性和方法:

表 1. Page 對象的屬性和方法

屬性或方法 說明
IsValid 屬性 這是最有用的屬性。該屬性可以檢查整個表單是否有效。通常在更新數據庫之前進行該檢查。只有 Validators 集中的所有對象全部有效,該屬性才為真,并且不將該值存入緩存。
Validators 屬性 該頁所有驗證對象的集合。這是實現 IValidator 界面的對象的集合。
Validate 方法 在驗證時調用的一種方法。在 Page 對象上默認的執(zhí)行方式是轉至每個驗證器,并要求各驗證器自行評估。


Validators 集合對于許多任務都非常有用。該集合是實現 IValidator 界面的對象的集合。我之所以使用對象這個詞,而不是使用控件,是因為 Page 對象只關注 IValidator 界面。既然所有的驗證器通常都是用來實現 IValidator 的一些可視化控件,那么任何人都應能夠使用任意的驗證對象,并將驗證對象加入頁面中。

IValidator 界面包含以下屬性和方法:

表 2. IValidator 界面的屬性和方法

屬性或方法 說明
IsValid 屬性 指出單獨的驗證對象進行的有效性檢查是否已經通過。您可以在驗證后手工更改該值。
ErrorMessage 屬性 介紹驗證對象要驗證的錯誤以及可能會向用戶顯示的錯誤。
Validate 方法 對驗證對象執(zhí)行有效性檢查,以更新其 IsValid 值。


您可以使用該界面執(zhí)行一些有趣的任務。例如,要將頁面重置為有效的狀態(tài),請使用以下代碼(如 C# 中的示例所示):

IValidator val;
foreach(val in Validators) {
Val.IsValid = true;
}

要重新執(zhí)行整個驗證序列,請使用以下代碼:

IValidator val;
foreach(val in Validators) {
Val.Validate();
}

如果有 Beta 1 版或更高版本,也可以只對 Page 對象調用 Validate 方法,這樣可以完成相同的任務。要在驗證前進行某些更改,可以覆蓋 Validate 方法。本例顯示一個包含驗證器的頁面,其中的驗證器根據復選框的值開或關:

public class Conditional : Page {
public HtmlInputCheckBox chkSameAs;
public RequiredFieldValidator rfvalShipAddress;

protected override void Validate() {
//只檢查到貨地址(如果與付款地址不同)
bool enableShip = !chkSameAs.Checked;
rfvalShipAddress.Enabled = enableShip;
//現在執(zhí)行驗證
base.Validate();
}
}