深入講解 ASP+ 驗證(二)
發(fā)表時間:2023-08-11 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]服務(wù)器端的驗證序列 了解頁面的有效期非常重要。如果習(xí)慣于在 Visual Basic 或類似功能齊全的客戶機工具中處理表單,則需要花一定的時間來了解。頁面和頁面上的所有對象并非在與用戶交互時一直有效...
服務(wù)器端的驗證序列
了解頁面的有效期非常重要。如果習(xí)慣于在 Visual Basic 或類似功能齊全的客戶機工具中處理表單,則需要花一定的時間來了解。頁面和頁面上的所有對象并非在與用戶交互時一直有效,盡管有時表面上是這樣。
以下是在第一次訪問某個頁面時一個簡化的事件序列:
基于 ASPX 文件創(chuàng)建頁面及其控件。
觸發(fā) Page_Load 事件。
頁面和控件屬性保存在一個隱藏字段中。
頁面和控件轉(zhuǎn)換到 HTML。
丟棄所有內(nèi)容。
現(xiàn)在,當用戶單擊某個按鈕或類似控件時,將返回服務(wù)器,然后執(zhí)行一個類似的事件序列。該序列稱為返回序列:
基于 ASPX 文件創(chuàng)建頁面及其控件。
從隱藏字段恢復(fù)頁面和控件屬性。
根據(jù)用戶輸入更新頁面控件。
觸發(fā) Page_Load 事件。
觸發(fā)更改通知事件。
頁面和控件屬性保存在一個隱藏字段中。
頁面和控件轉(zhuǎn)換到 HTML。
再次丟棄所有內(nèi)容。
我們?yōu)槭裁床粚⑺袑ο蟊A粼趦?nèi)存中呢?因為使用 ASP+ 建立的 Web 站點無法處理數(shù)量非常大的用戶。因此,服務(wù)器的內(nèi)存中只保留馬上要處理的內(nèi)容。
何時進行服務(wù)器端驗證?在第一次獲取頁面信息時,根本不會進行服務(wù)器端驗證。大多數(shù)最終用戶都非常認真,我們允許用戶自己確認在表單中填寫的信息是否正確,然后我們再使用紅色的文字通知用戶填錯的信息。
在返回事件序列中,第 3 步和第 4 步之間會進行驗證。也就是說,進行驗證是在來自用戶的數(shù)據(jù)裝回控件屬性后,但在大多數(shù)代碼執(zhí)行之前。這意味著在編寫用戶事件代碼時,通常可以利用已經(jīng)進行的驗證。一般情況下,您都會希望這樣做。
在該時刻進行驗證的缺點是:如果您要通過編程來修改某些影響該驗證的屬性,該時刻就太遲了。例如,您會發(fā)現(xiàn),如果通過編寫代碼來啟用或禁用驗證控件或更改驗證控件的屬性,在下一次處理該頁之前,不會看到任何影響。通過以下兩種方法可以避免這個問題:
在進行驗證之前修改屬性。
在屬性更改之后重新驗證控件。
這兩種方法均需要使用在 Page 對象上有效的驗證屬性和方法。
頁面 API
Page 對象包含一些與服務(wù)器端驗證有關(guān)的重要屬性和方法。表 1 中總結(jié)了這些屬性和方法:
表 1. Page 對象的屬性和方法
屬性或方法 說明
IsValid 屬性 這是最有用的屬性。該屬性可以檢查整個表單是否有效。通常在更新數(shù)據(jù)庫之前進行該檢查。只有 Validators 集中的所有對象全部有效,該屬性才為真,并且不將該值存入緩存。
Validators 屬性 該頁所有驗證對象的集合。這是實現(xiàn) IValidator 界面的對象的集合。
Validate 方法 在驗證時調(diào)用的一種方法。在 Page 對象上默認的執(zhí)行方式是轉(zhuǎn)至每個驗證器,并要求各驗證器自行評估。
Validators 集合對于許多任務(wù)都非常有用。該集合是實現(xiàn) IValidator 界面的對象的集合。我之所以使用對象這個詞,而不是使用控件,是因為 Page 對象只關(guān)注 IValidator 界面。既然所有的驗證器通常都是用來實現(xiàn) IValidator 的一些可視化控件,那么任何人都應(yīng)能夠使用任意的驗證對象,并將驗證對象加入頁面中。
IValidator 界面包含以下屬性和方法:
表 2. IValidator 界面的屬性和方法
屬性或方法 說明
IsValid 屬性 指出單獨的驗證對象進行的有效性檢查是否已經(jīng)通過。您可以在驗證后手工更改該值。
ErrorMessage 屬性 介紹驗證對象要驗證的錯誤以及可能會向用戶顯示的錯誤。
Validate 方法 對驗證對象執(zhí)行有效性檢查,以更新其 IsValid 值。
您可以使用該界面執(zhí)行一些有趣的任務(wù)。例如,要將頁面重置為有效的狀態(tài),請使用以下代碼(如 C# 中的示例所示):
IValidator val;
foreach(val in Validators) {
Val.IsValid = true;
}
要重新執(zhí)行整個驗證序列,請使用以下代碼:
IValidator val;
foreach(val in Validators) {
Val.Validate();
}
如果有 Beta 1 版或更高版本,也可以只對 Page 對象調(diào)用 Validate 方法,這樣可以完成相同的任務(wù)。要在驗證前進行某些更改,可以覆蓋 Validate 方法。本例顯示一個包含驗證器的頁面,其中的驗證器根據(jù)復(fù)選框的值開或關(guān):
public class Conditional : Page {
public HtmlInputCheckBox chkSameAs;
public RequiredFieldValidator rfvalShipAddress;
protected override void Validate() {
//只檢查到貨地址(如果與付款地址不同)
bool enableShip = !chkSameAs.Checked;
rfvalShipAddress.Enabled = enableShip;
//現(xiàn)在執(zhí)行驗證
base.Validate();
}
}