明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

深入講解 ASP+ 驗(yàn)證(4)

[摘要]有效性規(guī)則和有用的錯(cuò)誤信息 每個(gè)驗(yàn)證器會(huì)顯示有關(guān)特定控件特定情況的特定錯(cuò)誤信息。其中有一些確認(rèn)是否有效的規(guī)則,開(kāi)始,您作為一個(gè)開(kāi)發(fā)人員可能會(huì)有些混淆,但是如果要生成對(duì)用戶(hù)有實(shí)際幫助的錯(cuò)誤信息,這些規(guī)...
有效性規(guī)則和有用的錯(cuò)誤信息

每個(gè)驗(yàn)證器會(huì)顯示有關(guān)特定控件特定情況的特定錯(cuò)誤信息。其中有一些確認(rèn)是否有效的規(guī)則,開(kāi)始,您作為一個(gè)開(kāi)發(fā)人員可能會(huì)有些混淆,但是如果要生成對(duì)用戶(hù)有實(shí)際幫助的錯(cuò)誤信息,這些規(guī)則是必要的。

所有空的驗(yàn)證器(除了 RequiredFieldValidator)均會(huì)被認(rèn)為有效。如果某個(gè)空值無(wú)效,您通常需要一個(gè) RequiredFieldValidator 和一個(gè)其它驗(yàn)證器。您需要這樣做,因?yàn)橐话闱闆r下,您總是希望對(duì)空驗(yàn)證器和有效性顯示不同的錯(cuò)誤信息。您也可以使用不明確的信息,例如“您必須輸入一個(gè)值,并且該值必須在 1 和 10 之間”。

在輸入字段無(wú)法轉(zhuǎn)換為指定數(shù)據(jù)類(lèi)型時(shí)使用的另一個(gè)特殊規(guī)則與 CompareValidator 和 RangeValidator 有關(guān)。對(duì)指定了 ControlToCompare 的 CompareValidator 進(jìn)行的有效性評(píng)估過(guò)程類(lèi)似如下所述:

如果 ControlToValidate 引用的輸入字段為空,則有效。
如果 ControlToValidate 引用的輸入字段無(wú)法轉(zhuǎn)換成所需數(shù)據(jù)類(lèi)型,則無(wú)效。
如果 ControlToCompare 引用的輸入字段無(wú)法轉(zhuǎn)換成所需數(shù)據(jù)類(lèi)型,則有效。
輸入字段轉(zhuǎn)換成所需數(shù)據(jù)類(lèi)型并進(jìn)行比較。
第三步看起來(lái)有些不符合直覺(jué)。之所以這樣評(píng)估,是因?yàn)槿绻?yàn)證器同時(shí)檢查多個(gè)字段的有效性,很難為該驗(yàn)證器寫(xiě)出有意義的錯(cuò)誤信息。應(yīng)使用一個(gè)獨(dú)立的驗(yàn)證器來(lái)報(bào)告 ControlToCompare 輸入字段中的錯(cuò)誤情況。RangeValidator 的工作方式類(lèi)似,具有 maximum 和 minimum 屬性。


Enabled、Visible 和 Display 屬性的作用

驗(yàn)證器的 Enabled、Visible 和 Display 屬性之間的區(qū)別可能不是非常明顯。

Display=None 可以用來(lái)指定驗(yàn)證器不直接顯示任何內(nèi)容,但是仍然進(jìn)行評(píng)估,仍然影響總體的有效性,并且仍可以將錯(cuò)誤放在客戶(hù)機(jī)和服務(wù)器上的摘要中。對(duì)于客戶(hù)端驗(yàn)證,這些值確定使用可見(jiàn)性樣式特性還是使用顯示樣式特性來(lái)打開(kāi)或關(guān)閉驗(yàn)證器。對(duì)于服務(wù)器端驗(yàn)證,Display=Dynamic 表示輸入有效時(shí)不顯示任何內(nèi)容,而 Display=Static 表示顯示一個(gè)不換行的空格 (" ")。使用最后一個(gè)設(shè)置是為了表中只包含驗(yàn)證器的單元格在有效時(shí),不會(huì)折疊成不顯示任何內(nèi)容。

為什么不只使用 Visible=false 使驗(yàn)證器不可見(jiàn)呢?在 ASP+ 中,控件的 Visible 屬性有許多含義:Visible=false 的控件根本不會(huì)被處理來(lái)預(yù)顯示或顯示。正是因?yàn)檫@種含義,驗(yàn)證器的 Visible=false 意味著不僅不會(huì)顯示任何內(nèi)容,而且無(wú)法使用。不會(huì)對(duì)這樣的驗(yàn)證器進(jìn)行評(píng)估,不會(huì)影響頁(yè)面的有效性,也不會(huì)將錯(cuò)誤放在摘要中。

Enabled 則為中性。對(duì)于大多數(shù)情況,Enabled=false 與 Visible=false 的效果完全相同。在 Beta 1 版或更高版本中,存在一個(gè)重要的區(qū)別:在客戶(hù)端驗(yàn)證中,禁用的驗(yàn)證器仍會(huì)發(fā)送到瀏覽器中,但是處于禁用狀態(tài)。您可以使用客戶(hù)端腳本中的 ValidatorEnable 函數(shù)激活該驗(yàn)證器。

使用 Visible 或 Enabled 控制是否進(jìn)行驗(yàn)證時(shí),應(yīng)注意上述服務(wù)器上的事件順序;蛘咴隍(yàn)證之前進(jìn)行更改,或者在更改之后重新驗(yàn)證。否則,它們的 IsValid 值不會(huì)將更改反映到屬性上。


CustomValidator 控件

擴(kuò)展驗(yàn)證框架最簡(jiǎn)單的方法是使用 CustomValidator 控件。該控件既可以用來(lái)執(zhí)行其它驗(yàn)證控件無(wú)法進(jìn)行的驗(yàn)證,也可以執(zhí)行需要訪問(wèn)服務(wù)器上信息(例如數(shù)據(jù)庫(kù)或 Web 服務(wù))的驗(yàn)證。

如果添加了只定義一個(gè)服務(wù)器驗(yàn)證函數(shù)的 CustomValidator,您會(huì)注意到,該驗(yàn)證器并不參與客戶(hù)端驗(yàn)證。當(dāng)用戶(hù)使用 tab 鍵在各字段之間切換時(shí),CustomValidator 不會(huì)更新,并且需要往返服務(wù)器一次以執(zhí)行其驗(yàn)證。如果要使用 CustomValidator 執(zhí)行不需要任何服務(wù)器上信息的檢查,您也可以使用 ClientValidationFunction 屬性讓驗(yàn)證器完全參與客戶(hù)端驗(yàn)證。假設(shè)您提供了一個(gè) ClientValidationFunction,理想情況下,應(yīng)與服務(wù)器驗(yàn)證處理程序執(zhí)行完全相同的檢查。但實(shí)際上,只是執(zhí)行該驗(yàn)證的一部分?蛻(hù)端驗(yàn)證函數(shù)進(jìn)行的驗(yàn)證不要超過(guò)在服務(wù)器上執(zhí)行的驗(yàn)證,因?yàn)楹诳秃苋菀桌@過(guò)該驗(yàn)證函數(shù)。

以下是在客戶(hù)機(jī)和服務(wù)器上使用 CustomValidator 的一個(gè)簡(jiǎn)單示例,只檢查輸入是否是偶數(shù)。以下先介紹服務(wù)器函數(shù)(在 C# 中):

public bool ServerValidation(object source, string value) {
try {
int i = int.FromString(value);
return ((i % 2) == 0);
} catch {
return false;
}
}

以下是該函數(shù)在客戶(hù)機(jī)上的聲明方法,以及一個(gè)執(zhí)行相同檢查的客戶(hù)端驗(yàn)證函數(shù)。這通常是 JScript 形式,不過(guò)如果您的目標(biāo)是 Microsoft® Internet Explorer,也可以使用 VBScript® 形式。

<asp:CustomValidator id="customVal2" runat=server
ErrorMessage="數(shù)字不可以被 2 除!"
ControlToValidate="txtCustomData"
OnServerValidationFunction=ServerValidation
ClientValidationFunction="CheckEven" /><br>
Data Field : <asp:TextBox id="txtCustomData" runat="server" />
<script language=javascript>
<!--
function CheckEven(source, value) {
var val = parseInt(value, 10);
if (isNaN(val))
return false;
return ((val % 2) == 0);
}
// -->
</script>

以下是使用 CustomValidator 的一些注意事項(xiàng):

與所有其它驗(yàn)證控件類(lèi)似(RequiredFieldValidator 除外),如果輸入字段為空,則認(rèn)為 CustomValidator 有效。
如果使用較舊的瀏覽器,或者關(guān)閉了客戶(hù)端驗(yàn)證,將無(wú)法調(diào)用客戶(hù)端驗(yàn)證函數(shù)。在定義該函數(shù)之前,您不必檢查所用瀏覽器的功能,但是需要確保瀏覽器不會(huì)因?yàn)槎x而造成腳本錯(cuò)誤。一定要使您的客戶(hù)端代碼作為 HTML 注釋?zhuān)缦吕尽?
兩個(gè)參數(shù)傳遞到您的客戶(hù)端函數(shù)中,與傳遞給服務(wù)器函數(shù)的參數(shù)對(duì)應(yīng)。第一個(gè)是客戶(hù)端驗(yàn)證器元素,第二個(gè)是 ControlToValidate 指定的控件值。不過(guò),在客戶(hù)機(jī)上,您可以選擇不為函數(shù)定義參數(shù),這樣也會(huì)正常工作。
如果使用 Beta1 版或更高版本,您可以保留 ControlToValidate 為空。在該模式中,服務(wù)器函數(shù)每次往返總會(huì)觸發(fā)一次,客戶(hù)端函數(shù)每次嘗試提交時(shí)總會(huì)觸發(fā)一次。您可以使用該特性來(lái)驗(yàn)證其它方法無(wú)法驗(yàn)證的控件,例如 CheckBoxList 或單獨(dú)的單選按鈕。如果條件是基于多個(gè)控件,并且您不希望用戶(hù)使用 tab 鍵在頁(yè)面上各字段之間切換時(shí)評(píng)估該條件,可以使用該方法。
Beta 1 版或更高版本中的另一個(gè)選項(xiàng)是掛接多個(gè)控件的 change 事件。方法是加入一些調(diào)用客戶(hù)端函數(shù) ValidatorHookupControl 的內(nèi)嵌腳本,如上所述。

哪些控件可以被驗(yàn)證?

要使控件可以被驗(yàn)證控件引用,該控件必須具有驗(yàn)證屬性。所有可以驗(yàn)證的控件均具有 ValidationPropertyAttribute 屬性,該屬性指明驗(yàn)證時(shí)應(yīng)讀取的屬性。如果編寫(xiě)自己的控件,可以通過(guò)提供其中一個(gè)特性來(lái)指定要使用的屬性,從而使該控件參與驗(yàn)證。

要使驗(yàn)證可以在客戶(hù)端正常進(jìn)行,該屬性必須與客戶(hù)端顯示的 HTML 元素的 value 特性對(duì)應(yīng)。許多復(fù)雜的控件(例如 DataGrid 和 Calendar)在客戶(hù)端沒(méi)有值,只能在服務(wù)器上進(jìn)行驗(yàn)證。因此,只有最接近 HTML 元素的控件才可以參與驗(yàn)證。此外,控件必須在客戶(hù)端具有單個(gè)邏輯值。因此,RadioButtonList 可以被驗(yàn)證,但是 CheckBoxList 不可以。


到此為止

上述對(duì) ASP+ 驗(yàn)證的講解可能已經(jīng)超過(guò)了您要了解的內(nèi)容。盡情享用吧!