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

首頁 > 編程 > ASP > 正文

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

2024-05-04 11:06:34
字體:
來源:轉載
供稿:網友
客戶端 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="取消"
   onclick="page_validationactive=false;"  
   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
   onchange="txtziponchange();" /></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
   onclick="onchangesameas();" >與付款地址相同<br>
<script language=javascript>
function onchangesameas() {
    var enableship = !event.srcelement.status;
    validatorenable(rfvalshipaddress, enableship);
}
</script>


有效性規則和有用的錯誤信息

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

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

在輸入字段無法轉換為指定數據類型時使用的另一個特殊規則與 comparevalidator 和 rangevalidator 有關。對指定了 controltocompare 的 comparevalidator 進行的有效性評估過程類似如下所述:

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


enabled、visible 和 display 屬性的作用

驗證器的 enabled、visible 和 display 屬性之間的區別可能不是非常明顯。

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

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

enabled 則為中性。對于大多數情況,enabled=false 與 visible=false 的效果完全相同。在 beta 1 版或更高版本中,存在一個重要的區別:在客戶端驗證中,禁用的驗證器仍會發送到瀏覽器中,但是處于禁用狀態。您可以使用客戶端腳本中的 validatorenable 函數激活該驗證器。

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


customvalidator 控件

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

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

以下是在客戶機和服務器上使用 customvalidator 的一個簡單示例,只檢查輸入是否是偶數。以下先介紹服務器函數(在 c# 中):

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

以下是該函數在客戶機上的聲明方法,以及一個執行相同檢查的客戶端驗證函數。這通常是 jscript 形式,不過如果您的目標是 microsoft® internet explorer,也可以使用 vbscript® 形式。

<asp:customvalidator id="customval2" runat=server
    errormessage="數字不可以被 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 有效。
如果使用較舊的瀏覽器,或者關閉了客戶端驗證,將無法調用客戶端驗證函數。在定義該函數之前,您不必檢查所用瀏覽器的功能,但是需要確保瀏覽器不會因為定義而造成腳本錯誤。一定要使您的客戶端代碼作為 html 注釋,如下例所示。
兩個參數傳遞到您的客戶端函數中,與傳遞給服務器函數的參數對應。第一個是客戶端驗證器元素,第二個是 controltovalidate 指定的控件值。不過,在客戶機上,您可以選擇不為函數定義參數,這樣也會正常工作。
如果使用 beta1 版或更高版本,您可以保留 controltovalidate 為空。在該模式中,服務器函數每次往返總會觸發一次,客戶端函數每次嘗試提交時總會觸發一次。您可以使用該特性來驗證其它方法無法驗證的控件,例如 checkboxlist 或單獨的單選按鈕。如果條件是基于多個控件,并且您不希望用戶使用 tab 鍵在頁面上各字段之間切換時評估該條件,可以使用該方法。
beta 1 版或更高版本中的另一個選項是掛接多個控件的 change 事件。方法是加入一些調用客戶端函數 validatorhookupcontrol 的內嵌腳本,如上所述。

哪些控件可以被驗證?

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

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


到此為止

上述對 asp+ 驗證的講解可能已經超過了您要了解的內容。盡情享用吧!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久综合伊人77777蜜臀| 菠萝蜜影院一区二区免费| 亚洲欧洲在线看| 欧美一乱一性一交一视频| 97高清免费视频| 26uuu另类亚洲欧美日本一| 欧美性猛交xxxx乱大交3| 国产日韩精品电影| 国产日韩中文字幕在线| 米奇精品一区二区三区在线观看| 色噜噜狠狠色综合网图区| 国产成人+综合亚洲+天堂| 久久夜色精品国产欧美乱| 亚洲一区二区三区在线免费观看| 国产精品一区二区三区免费视频| 日韩精品中文字幕有码专区| 欧美专区国产专区| 国内精品久久影院| 日韩av在线电影网| 亚洲欧洲xxxx| 午夜伦理精品一区| 中文字幕亚洲一区| 亚洲国产成人在线播放| 中文字幕国内精品| 这里只有精品在线观看| 亚洲最大成人网色| 中文字幕亚洲欧美| 欧美黑人狂野猛交老妇| 欧美性猛xxx| 91精品国产99久久久久久| 夜夜狂射影院欧美极品| 欧美视频第一页| 亚洲国产天堂久久综合| 国产成人精品视| 久久躁狠狠躁夜夜爽| 在线成人激情黄色| 精品无人区乱码1区2区3区在线| 国产精品日日摸夜夜添夜夜av| 国产精品欧美风情| 久久不射热爱视频精品| 欧美性猛交视频| 国产欧美精品日韩精品| 亚洲福利在线视频| 8x海外华人永久免费日韩内陆视频| 成人精品一区二区三区| 精品高清美女精品国产区| 国产欧美精品va在线观看| 欧美性xxxx在线播放| 久久69精品久久久久久国产越南| 精品久久久久久中文字幕大豆网| 欧美另类第一页| 久久久精品中文字幕| 98精品在线视频| www.欧美三级电影.com| 九九热最新视频//这里只有精品| 亚洲伊人久久大香线蕉av| www欧美日韩| 国产99久久精品一区二区| 欧美日韩免费网站| 91色琪琪电影亚洲精品久久| 欧美激情在线有限公司| www.久久撸.com| 成年人精品视频| 日韩av毛片网| 成人a免费视频| 欧美日韩电影在线观看| 欧美亚洲激情视频| 91亚洲国产成人精品性色| 国产亚洲成精品久久| 91爱爱小视频k| 免费91在线视频| 国产精品入口福利| 国产成人涩涩涩视频在线观看| 精品国产乱码久久久久酒店| 亚洲少妇中文在线| 亚洲精品视频播放| 日韩大片免费观看视频播放| 日韩性生活视频| 91麻豆国产语对白在线观看| 永久免费精品影视网站| 岛国av一区二区三区| 亚洲国产成人爱av在线播放| 日本亚洲欧洲色| 海角国产乱辈乱精品视频| 久久91亚洲精品中文字幕| 国产成人亚洲综合| 日韩精品视频在线观看免费| 国产精品专区一| 国产精选久久久久久| xxav国产精品美女主播| 九九热精品视频国产| 亚洲三级免费看| 亚洲男人第一网站| 中文字幕一区二区三区电影| 日韩中文字幕在线视频| 色av中文字幕一区| 中文字幕自拍vr一区二区三区| 最新国产成人av网站网址麻豆| 日韩欧美高清在线视频| 最近2019年日本中文免费字幕| 国语自产精品视频在线看| 亲爱的老师9免费观看全集电视剧| 亚洲精品视频在线播放| 91社影院在线观看| 国产v综合v亚洲欧美久久| 欧洲成人在线观看| 欧美性做爰毛片| 最近2019年日本中文免费字幕| 4438全国成人免费| 欧美日本亚洲视频| 国产精品久久久久99| 97涩涩爰在线观看亚洲| 日韩精品视频在线免费观看| 欧美精品电影免费在线观看| 日韩欧美黄色动漫| 亚洲第一网站男人都懂| 亚洲精品成人网| 亚洲男人天堂2019| 久久精视频免费在线久久完整在线看| 亚洲丁香久久久| 日韩欧美一区视频| 国产精品免费久久久| 一个人看的www欧美| 久久精品最新地址| 欧美在线国产精品| 久久精品色欧美aⅴ一区二区| 一本色道久久综合狠狠躁篇的优点| 久久精品国产一区二区电影| 欧美夫妻性生活xx| 国产精品毛片a∨一区二区三区|国| 国产999精品视频| 久久免费视频在线观看| 91亚洲精品久久久久久久久久久久| 欧美日韩国产中文精品字幕自在自线| 狠狠躁夜夜躁人人躁婷婷91| 亚洲第一视频网| 亚洲视频在线观看免费| 久99九色视频在线观看| 国产精品爽爽ⅴa在线观看| 欧美亚洲免费电影| 日韩高清欧美高清| 亚洲欧美成人一区二区在线电影| 国产精品影院在线观看| 国产亚洲精品久久久久动| 日韩欧美aⅴ综合网站发布| 精品欧美国产一区二区三区| 78色国产精品| 亚洲精品久久久久久久久久久| 精品成人国产在线观看男人呻吟| 亚洲深夜福利在线| 亚洲欧美日韩精品久久| 法国裸体一区二区| 国产中文字幕91| 欧美老女人www| 日韩免费黄色av| 欧美在线观看日本一区| 国产亚洲人成a一在线v站| 国产精品三级在线| 91亚洲精品久久久久久久久久久久| 日韩av有码在线| 久久99亚洲热视| 久久在线观看视频| 伊人久久久久久久久久| 高清亚洲成在人网站天堂|