亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > ASP > 正文

深入講解 ASP+ 驗證(三)

2024-05-04 11:10:21
字體:
來源:轉載
供稿:網友
客戶端的驗證

如果您的頁面啟用了客戶端驗證,則在往返過程中會發生完全不同的事件序列??蛻舳说尿炞C使用客戶端 Jscript® 實現。實現該驗證不需要任何二進制組件。

盡管 Jscript 語言的標準化做得很好,但是用于與瀏覽器中的 HTML 文檔交互的文檔對象模型 (Document Object Model, DOM) 沒有廣泛采用的標準。因此,客戶端的驗證只在 Internet Explorer 4.0 和更高版本中進行,因為該驗證的對象是 Internet Explorer DOM。

從服務器的角度來說,客戶端的驗證只意味著驗證控件將不同的內容發送到 HTML 中。除此之外,其事件序列完全相同。服務器端的檢查仍然執行。盡管看起來似乎多余,但是卻十分重要,因為:

某些驗證控件可能不支持客戶端腳本。有一個很好的例子:如果要同時使用 CustomValidator 和服務器驗證函數,但是沒有客戶機驗證函數。
安全性注意事項。某些人可以很容易得到一個包含腳本的頁面,然后禁用或更改該頁面。您不應利用腳本來阻止壞數據進入您的系統,而只應是為了用戶得到更快的反饋。因此,如果要使用 CustomValidator,則不應提供沒有相應服務器驗證函數的客戶機驗證函數。
每個驗證控件都可以確保將一個標準的客戶端腳本塊發送到頁面中。實際上,這只是一小部分代碼,其中包含對腳本庫 WebUIValidation.js 中的代碼的引用。這個腳本庫文件包含客戶端驗證的所有邏輯,該文件需單獨下載,并且可以存儲在瀏覽器的緩存中。

關于腳本庫

因為驗證 Web 控件腳本在腳本庫中,所以不必將所有客戶端驗證的代碼直接發送到頁面中,盡管表面上似乎是這樣做的。主要的腳本文件引用類似如下所示:

<script language="javascript"      
src="/_aspx/1.0.9999/script/WebUIValidation.js"></script>

默認情況下,腳本文件將安裝在 "_aspx" 目錄中默認的根目錄下,并使用相對于根的腳本 include 指令調用,該指令以正斜線開頭。該引用表明每個單獨的對象不必包含腳本庫,同一臺計算機上的所有頁面可以引用同一個文件。您會注意到,該路徑中還有一個公用的語言運行時版本號,以便不同的運行時版本可以在同一臺計算機上運行。

如果查看一下您默認的虛擬根目錄,您會找到該文件并查看其中的內容。這些文件的位置在 config.web 文件中指定。config.web 文件是一個用于大多數 ASP+ 設置的 XML 文件。以下是該文件中位置的定義:

    <webcontrols
        clientscriptslocation="/_aspx/{0}/script/"
    />        

鼓勵您閱讀該腳本,以便深入了解發生的事件。不過,建議您不要修改這些腳本,因為它們的功能與特定的運行時版本緊密相連。在運行時版本更新時,這些腳本可能也需要相應的更新,您將或者放棄更改,或者面臨腳本不工作的問題。如果特定項目必須更改這些腳本,先備份這些腳本,然后將您的項目指向備份文件,方法是使用私有的 config.web 文件替代這些文件的位置。如果字符串中包含格式指令 "{0}",運行時版本號將替換該指令。最好將該位置更改為一個相對引用或絕對引用。

禁用客戶端的驗證

有時您可能不希望進行客戶端驗證。如果輸入字段的數目很少,客戶端驗證可能用處不大。您畢竟每次都要有一個需要往返服務器一次的邏輯。您會發現客戶機上動態出現的信息對您的布局會有負面影響。

要禁用客戶端驗證,應使用 Page 指令 "clienttarget=downlevel"。該指令類似以下 ASPX 文件的開頭:

<%@ Page Language="c#" clienttarget=downlevel %>

該指令的默認值為 "auto",表示您只對 Microsoft Internet Explorer 4.0 或更高版本進行客戶端驗證。

注意:   不幸的是,在 Beta 1 中,該指令并非僅僅是禁用驗證,同時還會使所有 Web 控件使用 HTML 3.2 標記來處理,這可能會產生意想不到的結果。最終版本提供了更好的方法來控制這個問題。

客戶端事件序列

該序列是在運行包含客戶端驗證的頁面時發生的事件序列:

在頁面載入瀏覽器時,需要對每個驗證控件進行一些初始化。這些控件作為 <span> 標記發送,其 HTML 特性與服務器上的特性最接近。最重要的是,此時會將驗證器引用的所有輸入元素“掛接”。被引用的輸入元素將修改其客戶端事件,以便在每次輸入更改時調用驗證例程。
腳本庫中的代碼將在用戶使用 tab 鍵在各字段之間切換時執行。某個獨立的字段更改時,將重新評估驗證條件,根據需要使驗證器可見或不可見。
當用戶嘗試提交表單時,將重新評估所有驗證器。如果這些驗證器全部有效,表單將提交給服務器。如果存在一處或多處錯誤,則會出現下述情況:
提交被取消。表單并不提交給服務器。
所有無效的驗證器均可見。
如果某個驗證摘要包含 ShowSummary=true,則將收集來自驗證控件的所有錯誤,并使用這些錯誤更新其內容。
如果某個驗證摘要包含 ShowMessageBox=true,則將收集錯誤,并在客戶機的信息框中顯示這些錯誤。
因為在每次輸入更改時或提交時會執行客戶端驗證控件,所以在客戶機上通常會評估這些驗證控件兩次或兩次以上。請注意,提交后,仍將會在服務器上對這些驗證控件進行重新評估。

客戶端 API

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

表 3. 客戶端對象

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


繞過客戶端驗證

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

<input type=image runat=server
   value="取消"
     
   OnServerClick=cmdCancel_Click >

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

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

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

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

特殊效果

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

public class ChangeColorPage : Page {
    public Label lblZip;
    public RegularExpressionValidator valZip;
    
    protected override void OnLoad(EventArgs e) {            
        lblZip.ForeColor = valZip.IsValid? Color.Black : Color.Red;
    }               
}

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

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

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

Beta 1 客戶端 API

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

表 4. 從客戶端腳本調用的函數

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


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

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

    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
    >與付款地址相同<br>
<script language=javascript>
function OnChangeSameAs() {
    var enableShip = !event.srcElement.status;
    ValidatorEnable(rfvalShipAddress, enableShip);
}
</script>



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一性一乱一交一视频| **欧美日韩vr在线| 日韩视频在线一区| 国产va免费精品高清在线观看| 91九色单男在线观看| 日韩精品久久久久| 欧美午夜片欧美片在线观看| 亚洲大胆美女视频| 久精品免费视频| 亚洲最大福利网站| 欧洲精品久久久| 亚洲国产精品yw在线观看| 亚洲天堂av在线播放| 久久精品精品电影网| 97涩涩爰在线观看亚洲| 欧美亚洲在线播放| 欧美午夜影院在线视频| 最近2019好看的中文字幕免费| 国产精品一区专区欧美日韩| 国产色婷婷国产综合在线理论片a| 91精品久久久久久综合乱菊| 色哟哟网站入口亚洲精品| 国产精品免费小视频| 国产成人精品国内自产拍免费看| 日韩欧美一区二区三区久久| 日韩av色在线| 久久久免费观看| 亚洲色图50p| 日韩成人在线视频| 成人黄色av播放免费| 日韩免费在线播放| 国产亚洲精品久久久久久777| 大桥未久av一区二区三区| 亚洲成av人片在线观看香蕉| 国产精品91在线观看| 久久五月情影视| 国产精品6699| 亚洲第一天堂av| 97免费在线视频| 国产免费一区二区三区在线能观看| 日韩电影在线观看中文字幕| 亚洲国产精品久久精品怡红院| 国产精品99久久99久久久二8| 亚洲精品456在线播放狼人| 在线视频免费一区二区| 色先锋资源久久综合5566| 国产精品久久久久久久久久久久久| 欧美激情精品久久久久久| 91精品国产综合久久久久久蜜臀| 97超级碰碰人国产在线观看| 欧美日韩成人免费| 日韩美女在线观看一区| 成年无码av片在线| 久久精品国产2020观看福利| 国产成人亚洲综合91精品| 国产成人一区二区在线| 91精品久久久久久久久久久久久| 亚洲欧洲美洲在线综合| 一本色道久久综合狠狠躁篇怎么玩| 久久这里只有精品99| 亚洲一区免费网站| 国产精品6699| 丁香五六月婷婷久久激情| 亚洲男人天堂2024| 欧美丰满片xxx777| 国产在线观看精品| 久久久精品亚洲| 最近中文字幕mv在线一区二区三区四区| 国产丝袜一区二区| 亚洲国产成人精品女人久久久| 欧美肥老妇视频| 国产精品热视频| 一区二区三区国产视频| 一区二区在线视频播放| 日本中文字幕不卡免费| 久久精品国产亚洲精品2020| 久久久国产视频91| 久久免费福利视频| 一本一本久久a久久精品牛牛影视| 欧美在线视频一二三| 国产成人av在线播放| 亚洲一区二区三区视频播放| 66m—66摸成人免费视频| 亚洲永久在线观看| 欧美另类精品xxxx孕妇| 亚洲精品欧美一区二区三区| 97久久精品视频| 欧美又大又硬又粗bbbbb| 亚洲一区国产精品| 欧美亚洲日本网站| 色综合五月天导航| 午夜精品免费视频| 日韩在线观看你懂的| 亚洲最大av网| 欧美成人在线免费视频| 91精品国产777在线观看| 韩国欧美亚洲国产| 国产精品人成电影在线观看| 91视频国产一区| 日韩av综合网站| 欧美另类老女人| 中文字幕亚洲无线码a| 国产98色在线| 日韩电影免费在线观看中文字幕| 91九色视频导航| 26uuu国产精品视频| 66m—66摸成人免费视频| 国产视频精品在线| 亚洲第一色在线| 国内免费精品永久在线视频| 成人乱人伦精品视频在线观看| 精品视频—区二区三区免费| 亚洲激情视频在线播放| 日韩精品中文字| 2019中文字幕在线| 久久久天堂国产精品女人| 国产精品扒开腿做| 亚洲精品美女在线| 欧美最猛黑人xxxx黑人猛叫黄| 精品一区二区三区四区| 欧美激情在线狂野欧美精品| 日本亚洲欧美三级| 国产日韩中文在线| 黑人精品xxx一区| 欧美成人精品一区二区三区| 欧美在线视频一区二区| 欧美一级大片在线免费观看| 国产亚洲欧洲黄色| 亚洲欧美日韩天堂一区二区| 国产精品久在线观看| 欧美亚洲国产另类| 中文字幕日韩在线播放| 国产男女猛烈无遮挡91| 日韩中文有码在线视频| 亚洲在线一区二区| 91探花福利精品国产自产在线| 国产做受69高潮| 中文字幕免费精品一区高清| 97香蕉超级碰碰久久免费软件| 亚洲成人av片| 亚洲电影免费观看高清完整版| 欧美精品videofree1080p| 日韩在线欧美在线国产在线| 狠狠躁18三区二区一区| 亚洲女人天堂色在线7777| 久久久国产成人精品| 4k岛国日韩精品**专区| 国产丝袜一区视频在线观看| 午夜精品一区二区三区av| 美乳少妇欧美精品| 国产日韩欧美影视| 国产精品久久久久久五月尺| 久久在线免费视频| 国内精品伊人久久| 国产97在线观看| 亚洲欧美日韩一区二区三区在线| 久久久久久久久久久91| 精品视频久久久久久久| 欧美综合激情网| 中文字幕av一区中文字幕天堂| 国产精品免费福利| 国产精品网红福利| 91网站在线看| 欧美肥老太性生活视频|