人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統(tǒng)下載站 > 技術(shù)開發(fā)教程 > 詳細頁面

深入講解 ASP+ 驗證 (轉(zhuǎn)自ms 二)

深入講解 ASP+ 驗證 (轉(zhuǎn)自ms 二)

更新時間:2022-06-28 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

客戶端 API

有一個可以在客戶機上使用的小型 API,以便在您自己的客戶端代碼中實現(xiàn)各種效果。因為某些例程不可能隱藏,所以理論上講,您可以利用客戶端驗證腳本所定義的所有變量、特性和函數(shù)。不過,其中許多都是可以更改的實施細節(jié)。以下總結(jié)了我們鼓勵您使用的客戶端對象。

表 3. 客戶端對象

名稱 類型 說明
Page_IsValid Boolean 變量 指出頁面當前是否有效。驗證腳本總是保持該變量為最新。
Page_Validators 元素數(shù)組 這是包含頁面上所有驗證器的數(shù)組。
Page_ValidationActive Boolean 變量 指出是否應進行驗證。將此變量設(shè)置為 False 可以通過編程關(guān)閉驗證。
isvalid Boolean 屬性 每個客戶端驗證器均具有該屬性,指出驗證器當前是否有效。請注意,在 PDC 版本中,該屬性混用大小寫 ("IsValid")。


繞過客戶端驗證

您經(jīng)常需要執(zhí)行的一項任務(wù)是在頁面上添加“取消”按鈕或?qū)Ш桨粹o。在這種情況下,即使頁面上有錯誤,您可能也希望使用該按鈕提交頁面。因為客戶端按鈕 "onclick" 事件在表單的 "onsubmit" 事件之前發(fā)生,因此可能會避免提交檢查,并繞過驗證。以下說明如何使用 HTML Image 控件作為“取消”按鈕完成該任務(wù):

<input type=image runat=server
 value="取消"
 onclick="Page_ValidationActive=false;"
 OnServerClick=cmdCancel_Click >

使用 Button 或 ImageButton 控件執(zhí)行該任務(wù)會出現(xiàn)一些混淆,因為 "onclick" 事件假定為同名的服務(wù)器端事件。您應在客戶端腳本中設(shè)置該事件:

<asp:ImageButton runat=server id=cmdImgCancel
AlternateText="取消"
OnClick=cmdCancel_Click/>

<script language="javascript">
document.all["cmdImgCancel "].onclick =
 new Function("Page_ValidationActive=false;");
</script>

解決該問題的另一種方法是:對“取消”按鈕進行一定的設(shè)置,使其在返回時不會觸發(fā)客戶端腳本中的提交事件。HtmlInputButton 和 LinkButton 控件就是這樣的例子。

特殊效果

另一種常見的要求是:在出錯時,除了由驗證器自身顯示的錯誤信息外,還需要其它一些效果。在這種情況下,您所作的任何修改均需在服務(wù)器或客戶機上同時進行。假設(shè)您需要加入一個 Label,根據(jù)輸入是否有效來更改顏色。以下是如何在服務(wù)器上實現(xiàn)該任務(wù):

public class ChangeColorPage : Page {
public Label lblZip;
public RegularExpressionValidator valZip;

protected override void OnLoad(EventArgs e) {
lblZip.ForeColor = valZip.IsValid? Color.Black : Color.Red;

}

上述方法一切都很完美,但是,只要您如上所述修改驗證,就會發(fā)現(xiàn)除非您在客戶機上進行了相同的操作,否則看起來會非常不一致。驗證框架會使您避免許多這種雙重效果,但是無法避免您必須在客戶機和服務(wù)器上同時實現(xiàn)的其它效果。以下是在客戶機上執(zhí)行同一任務(wù)的片段:

<asp:Label id=lblZip runat=server
 Text="Zip Code:"/>
<asp:TextBox id=txtZip runat=server
 OnChange="txtZipOnChange();" /></asp:TextBox><br>
<asp:RegularExpressionValidator id=valZip runat=server
 ControlToValidate=txtZip
 ErrorMessage="無效的郵政編碼"
 ValidationExpression="[0-9]{5}" /><br>

<script language=javascript>
function txtZipOnChange() {
 //如果客戶端驗證未處于活動狀態(tài),則不執(zhí)行任何操作
 if (typeof(Page_Validators) == "undefined")return;
 //更改標簽的顏色
 lblZip.style.color = valZip.isvalid ? "Black" : "Red";
}
</script>

Beta 1 客戶端 API

對于 Beta 1 版,一些可以從客戶端腳本調(diào)用的函數(shù)會造成其它一些情況。

表 4. 從客戶端腳本調(diào)用的函數(shù)

名稱 說明
ValidatorValidate(val) 將某個客戶端驗證器作為輸入。使驗證器檢查其輸入并更新其顯示。
ValidatorEnable(val, enable) 獲取一個客戶端驗證器和一個 Boolean 值。啟用或禁用客戶端驗證器。如果禁用,將不會評估客戶端驗證器,客戶端驗證器將總是顯示為有效。
ValidatorHookupControl(control, val) 獲取一個輸入 HTML 元素和一個客戶端驗證器。修改或創(chuàng)建該元素的 change 事件,以便在更改時更新驗證器。該函數(shù)適合于基于多個輸入值的自定義驗證器。


其特殊用途是啟用或禁用驗證器。如果您希望驗證只是在特定的情況下生效,可能需要在服務(wù)器和客戶機上同時更改激活狀態(tài),否則,您會發(fā)現(xiàn)用戶無法提交該頁面。

以下是上面的示例加上一個字段,該字段只在取消選中某個復選框時才會進行驗證。

public class Conditional : Page {
public HtmlInputCheckBox chkSameAs;
public RequiredFieldValidator rfvalShipAddress;
protected override void Validate() {
bool enableShip = !chkSameAs.Checked;
rfvalShipAddress.Enabled = enableShip;
base.Validate();
}
}

以下是客戶端等效的代碼:

<input type=checkbox runat=server id=chkSameAs
 onclick="OnChangeSameAs();" >與付款地址相同<br>
<script language=javascript>
function OnChangeSameAs() {
var enableShip = !event.srcElement.status;
ValidatorEnable(rfvalShipAddress, enableShip);
}
</script>


有效性規(guī)則和有用的錯誤信息

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

所有空的驗證器(除了 RequiredFieldValidator)均會被認為有效。如果某個空值無效,您通常需要一個 RequiredFieldValidator 和一個其它驗證器。您需要這樣做,因為一般情況下,您總是希望對空驗證器和有效性顯示不同的錯誤信息。您也可以使用不明確的信息,例如“您必須輸入一個值,并且該值必須在 1 和 10 之間”。

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

如果 ControlToValidate 引用的輸入字段為空,則有效。
如果 ControlToValidate 引用的輸入字段無法轉(zhuǎn)換成所需數(shù)據(jù)類型,則無效。
如果 ControlToCompare 引用的輸入字段無法轉(zhuǎn)換成所需數(shù)據(jù)類型,則有效。
輸入字段轉(zhuǎn)換成所需數(shù)據(jù)類型并進行比較。
第三步看起來有些不符合直覺。之所以這樣評估,是因為如果驗證器同時檢查多個字段的有效性,很難為該驗證器寫出有意義的錯誤信息。應使用一個獨立的驗證器來報告 ControlToCompare 輸入字段中的錯誤情況。RangeValidator 的工作方式類似,具有 maximum 和 minimum 屬性。


Enabled、Visible 和 Display 屬性的作用

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

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

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

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

使用 Visible 或 Enabled 控制是否進行驗證時,應注意上述服務(wù)器上的事件順序。或者在驗證之前進行更改,或者在更改之后重新驗證。否則,它們的 IsValid 值不會將更改反映到屬性上。


CustomValidator 控件

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

如果添加了只定義一個服務(wù)器驗證函數(shù)的 CustomValidator,您會注意到,該驗證器并不參與客戶端驗證。當用戶使用 tab 鍵在各字段之間切換時,CustomValidator 不會更新,并且需要往返服務(wù)器一次以執(zhí)行其驗證。如果要使用 CustomValidator 執(zhí)行不需要任何服務(wù)器上信息的檢查,您也可以使用 ClientValidationFunction 屬性讓驗證器完全參與客戶端驗證。假設(shè)您提供了一個 ClientValidationFunction,理想情況下,應與服務(wù)器驗證處理程序執(zhí)行完全相同的檢查。但實際上,只是執(zhí)行該驗證的一部分。客戶端驗證函數(shù)進行的驗證不要超過在服務(wù)器上執(zhí)行的驗證,因為黑客很容易繞過該驗證函數(shù)。

以下是在客戶機和服務(wù)器上使用 CustomValidator 的一個簡單示例,只檢查輸入是否是偶數(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ù)在客戶機上的聲明方法,以及一個執(zhí)行相同檢查的客戶端驗證函數(shù)。這通常是 JScript 形式,不過如果您的目標是 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 的一些注意事項:

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

哪些控件可以被驗證?

要使控件可以被驗證控件引用,該控件必須具有驗證屬性。所有可以驗證的控件均具有 ValidationPropertyAttribute 屬性,該屬性指明驗證時應讀取的屬性。如果編寫自己的控件,可以通過提供其中一個特性來指定要使用的屬性,從而使該控件參與驗證。

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


到此為止

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

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
主站蜘蛛池模板: 黎川县| 柘城县| 焉耆| 山东| 嵊州市| 新河县| 京山县| 肥西县| 江西省| 冀州市| 屏东县| 新绛县| 壶关县| 巴青县| 汉川市| 永年县| 南宁市| 穆棱市| 澄城县| 九江市| 科尔| 虞城县| 江孜县| 逊克县| 安龙县| 呼和浩特市| 黄陵县| 隆化县| 左权县| 搜索| 五寨县| 托里县| 凌海市| 苍山县| 东台市| 蛟河市| 仲巴县| 阳新县| 厦门市| 赤城县| 彰化县|