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

首頁 > 編程 > ASP > 正文

深入講解 ASP+ 驗證 (轉自ms 一)

2024-05-04 11:06:24
字體:
來源:轉載
供稿:網友
深入講解 asp+ 驗證
anthony moore
microsoft corporation
2000年10月

摘要:有關使用 asp+ 驗證 web 控件的詳細講解。

目錄


簡介
入門
何時發生何事?
服務器端的驗證序列
客戶端的驗證
有效性規則和有用的錯誤信息
enabled、visible 和 display 屬性的作用
customvalidator 控件
哪些控件可以被驗證?
到此為止


--------------------------------------------------------------------------------


簡介

這篇文章詳細講解了 asp+ 驗證控件的工作方式。如果要生成其中包含驗證控件的復雜頁面,或是要擴展驗證框架,建議您閱讀本文。如果要學習使用驗證控件,或是要決定是否使用驗證控件,請參見“asp+ 中的用戶輸入驗證(英文)”。


入門

我們知道,在整個 asp+ 開發過程中,了解驗證非常重要??纯慈缃竦拇蠖鄶瞪虡I web 站點,您會發現,這些站點中有許多表單,這些表單明顯是通過執行大量手寫的代碼來執行驗證。編寫驗證代碼并不是一件有趣的工作。如果要通過編寫代碼來顯示數據表或動態生成圖表,可能會很吸引人,但是沒有人可以向他的同事證實這種很“酷”的方法能夠禁止在姓名字段中輸入空值。

因為其它一些原因,web 應用程序的驗證也是非常麻煩的。html 3.2 對您可以控制的內容或可以從用戶處得到的反饋的限制很多,因此無法應用在功能更全的客戶機上可以使用的技巧,例如禁止用戶輸入某些字符,或發出嘀聲。使用瀏覽器腳本可能會產生更強大的驗證。但是這種方法很難得以證實,因為客戶瀏覽器中并非一定有腳本,并且惡意的用戶可以繞過。因此,為了保證站點安全,有必要對服務器進行同樣的檢查。

在開發 asp+ 時,我們的初衷是只使用一個控件來處理驗證,可能本該是一個能夠顯示錯誤的 textbox 控件。可是到了設計該控件時,卻發現無法實現這種愿望。我們研究了大量的數據輸入表單,試圖找到可以適用于盡可能多的表單的一種解決方案。我們發現,數據輸入表單具有許多有趣的特性:

盡管錯誤信息或圖標經常與輸入元素相鄰,但是它們幾乎總是位于表的不同單元格中。
頁面中經常會有一個區域來匯總所有錯誤。
許多站點包含客戶端腳本,以便提供更快捷的反饋,同時防止白白地在與服務器之間往返。
許多包含客戶端腳本的站點在出現錯誤時會顯示信息框。
不僅會驗證文本輸入,還會驗證下拉列表和單選按鈕。
如果某個字段為空,站點通常會顯示與該條目無效時不同的信息或圖標。
許多有效性檢查可以很好地代替常用的表達式。
驗證通常是基于兩個輸入之間的比較結果。
90% 或 90% 以上的驗證任務是一些常見的操作,例如檢查姓名或郵政編碼。大多數站點似乎仍在重復進行這些工作。
因為站點之間的差別通常太大,無法獲得一種完美的解決方案來處理每個站點的所有驗證任務。
考慮了上述所有情況,最終獲得的解決方案包括五個驗證器控件、validationsummary 控件以及與 page 對象的集成。同時很明顯,該解決方案需要擴展,在客戶機和服務器上均需要有一個 api 來配合。

我們在研究進行的各種驗證時發現,我們似乎需要一個更大的工具箱。在大多數組件環境中,例如 microsoft® activex®,我們可能本來試圖將所有驗證控件的功能集成到一個控件中,處理不同模式下的不同屬性。不過,幸好 microsoft® .net 框架中有神奇的繼承性,可以提供一套控件來對特定的屬性進行特定的驗證,因為派生每個新控件所需的額外工作量非常小。

這些控件所完成的大多數工作均在其公用的父級 basevalidator 中實現。您也可以從 basevalidator 或其它控件派生來完成各項工作。實際上,即使 basevalidator 都懶得實現其自己的 text 屬性,而是從 label 屬性繼承。


何時發生何事?

在處理包含驗證 web 控件的頁面時,了解事件序列非常有效。如果某個驗證條件是可選的,您需要準確了解客戶機和服務器上何時進行驗證。如果要自己編寫驗證例程,可能會非常耗時,或者有副作用。同時,了解調用驗證例程的時機也很重要。

首先,讓我們看一下服務器。


服務器端的驗證序列

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

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

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

基于 aspx 文件創建頁面及其控件。
從隱藏字段恢復頁面和控件屬性。
根據用戶輸入更新頁面控件。
觸發 page_load 事件。
觸發更改通知事件。
頁面和控件屬性保存在一個隱藏字段中。
頁面和控件轉換到 html。
再次丟棄所有內容。
我們為什么不將所有對象保留在內存中呢?因為使用 asp+ 建立的 web 站點無法處理數量非常大的用戶。因此,服務器的內存中只保留馬上要處理的內容。

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

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

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

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

頁面 api

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

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

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


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

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

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

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


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

    ivalidator val;
    foreach(val in validators) {
        val.isvalid = true;
    }

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

    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;
            //現在執行驗證
            base.validate();
        }
    }


客戶端的驗證

如果您的頁面啟用了客戶端驗證,則在往返過程中會發生完全不同的事件序列。客戶端的驗證使用客戶端 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,則將收集錯誤,并在客戶機的信息框中顯示這些錯誤。
因為在每次輸入更改時或提交時會執行客戶端驗證控件,所以在客戶機上通常會評估這些驗證控件兩次或兩次以上。請注意,提交后,仍將會在服務器上對這些驗證控件進行重新評估。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
另类少妇人与禽zozz0性伦| 美女av一区二区三区| www.精品av.com| 超碰精品一区二区三区乱码| 在线日韩欧美视频| 91精品国产99久久久久久| 日韩成人久久久| 国产成人亚洲精品| 亚洲精品日韩在线| 社区色欧美激情 | 国产精品亚洲综合天堂夜夜| 69视频在线播放| 国模极品一区二区三区| 国产精品午夜国产小视频| 国产成人一区二区三区| 国产一区二区精品丝袜| 久久久久久久999| 久久成人人人人精品欧| 亚洲男人天堂古典| 亚洲自拍欧美色图| 久热国产精品视频| 91免费视频国产| 亚洲综合大片69999| 亚洲视频电影图片偷拍一区| 亚洲色图25p| 久久99视频精品| 亚洲欧美精品伊人久久| 国产精品成人va在线观看| 亚洲最新在线视频| 欧美日韩第一视频| 成人黄色免费网站在线观看| 精品一区二区亚洲| 97超碰蝌蚪网人人做人人爽| 国产剧情日韩欧美| 亚洲男人天堂久| 久久亚洲私人国产精品va| 色老头一区二区三区在线观看| 欧美小视频在线| 亚洲v日韩v综合v精品v| 日韩欧美一区视频| 欧美丰满少妇xxxxx做受| 日韩av网址在线| 国产精品视频自拍| 久久久人成影片一区二区三区观看| 91精品国产综合久久久久久蜜臀| 国产精品偷伦视频免费观看国产| 97久久超碰福利国产精品…| 91探花福利精品国产自产在线| 国产精品高清免费在线观看| 久久久精品久久久| 亚洲欧美激情在线视频| 日韩成人中文字幕| 欧美激情中文字幕乱码免费| 亚洲美女视频网| 国产成人精品免高潮费视频| 中日韩美女免费视频网址在线观看| 欧美日韩国产综合视频在线观看中文| 亚洲国产婷婷香蕉久久久久久| 社区色欧美激情 | 欧美激情第6页| 久久久亚洲精品视频| 欧美韩国理论所午夜片917电影| 亚洲一区二区三区视频| 伊人伊人伊人久久| 久热精品视频在线免费观看| 欧美xxxx综合视频| 日韩欧美国产网站| 国产精品久久久久免费a∨大胸| 亚洲免费伊人电影在线观看av| 91精品国产乱码久久久久久久久| 欧美大片第1页| 中文字幕日韩综合av| 久久久国产成人精品| 国模视频一区二区| 国产精品成人av在线| 亚洲欧美国产日韩天堂区| 亚洲人精选亚洲人成在线| 91精品视频一区| 久久久久久美女| 欧美第一黄色网| 久久久成人的性感天堂| 精品久久在线播放| 国产精品高潮呻吟视频| 国产成人久久精品| 欧美激情视频三区| 国产日韩欧美在线观看| 在线观看欧美成人| 国产免费一区二区三区香蕉精| 欧美午夜激情在线| 中文字幕精品网| 国产精品男人爽免费视频1| 久久久久久国产精品| 国产suv精品一区二区| 国产欧美日韩最新| 91久久精品视频| 欧美主播福利视频| 国产成人亚洲综合| 亚洲第一精品福利| 欧美激情免费观看| 91免费视频国产| 精品久久久久久久久久久| 日韩一区二区在线视频| 韩国美女主播一区| 欧美激情精品久久久| 亚洲美女精品成人在线视频| 日韩在线观看视频免费| 狠狠色狠狠色综合日日小说| 亚洲精品理论电影| 欧美视频二区36p| 91美女片黄在线观看游戏| 欧美性视频网站| 欧美性xxxx极品hd满灌| 成人黄在线观看| 黑人狂躁日本妞一区二区三区| 91国内揄拍国内精品对白| 国产精品中文久久久久久久| 国外成人在线播放| 影音先锋欧美精品| 欧美视频免费在线观看| 亚洲第一页中文字幕| 久久精品免费播放| 18一19gay欧美视频网站| 欧美精品videos另类日本| 国产精品一区二区久久精品| 精品国产区一区二区三区在线观看| 亚洲精品日韩欧美| 久久中文字幕在线| 伊人久久久久久久久久久| 91国产在线精品| 国产一区二区三区在线播放免费观看| 国产亚洲精品日韩| 国内精品久久影院| 欧美色视频日本版| 色偷偷偷亚洲综合网另类| 亚洲自拍偷拍视频| 国产欧美精品在线播放| 亚洲free性xxxx护士hd| 77777亚洲午夜久久多人| 亚洲欧美另类国产| 国产一区二区三区在线播放免费观看| 精品久久久久国产| 国产精品日本精品| 中文字幕免费国产精品| 国产精品久久久久久久久久三级| 国产午夜精品视频| 九九久久久久99精品| 久久久久中文字幕2018| 中文字幕久热精品视频在线| 伊人久久精品视频| 欧美在线日韩在线| 国产美女直播视频一区| 欧美猛交免费看| 欧美日韩免费在线| 亚洲免费视频一区二区| 欧美激情影音先锋| www亚洲欧美| 国产欧美精品一区二区| 亚洲在线观看视频网站| 欧美性猛交xxxx乱大交3| 久久久91精品国产一区不卡| 韩国日本不卡在线| 亚洲国产欧美一区二区丝袜黑人| 亚洲一区www| 亚洲国产精品99|