日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Ajax Control Toolkit 32个服务器端控件

發布時間:2025/5/22 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ajax Control Toolkit 32个服务器端控件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. Accordion
【功能概述】Accordion可以讓你設計多個panel 并且一次只顯示一個Panel .在頁面上的顯示效果就像是使用了多個CollapsiblePanels只不過每一次只展開其中一個CollapsiblePanel.Accordion控件內部包含了若干個AccordionPane,每一個AccordionPane的template里包括了對其Header和Content的定義。我們可以在后臺代碼中通過SelectedIndex屬性取得當前展開的哪一個Panel,還可以控制哪一個Panel展開。

經常可以見到類似的效果,比如QQ、Msn好友分類的折疊效果。

【細節】
(1)不要把Accordion放在Table中而又把 FadeTransitions 設置為True,這將引起布局混亂
(2) 在AccordionPane模板中的Content中可以定義任何Web元素,表現的就像一個容器
(3) AccordionPane內容模板自動改變大小有三種AutoSize modes :None(推薦) Limit? Fill
(4) $find('ctl00_ContentPlaceHolder1_MyAccordion_AccordionExtender')這里找到的是Behavior.什么是Behavior呢?在Asp.net Ajax框架中包含一組動作并完成一個功能. Accordion的一個Behavior就是淡入淡出.

找到Behavior的引用,behavior.set_FadeTransitions() behavior.get_FadeTransitions()的方式來實現具體某一個Behavior的訪問和修改.

var behavior = $find('ctl00_SampleContent_MyAccordion_AccordionExtender');這種寫法是不好的,我們在自動測試的頁面中發現了更好的寫法: var behavior=$find("<%= MyAccordion.ClientID %>_AccordionExtender");

【代碼示意】?

????? <script language="javascript" type="text/javascript">

??????????? function toggleFade()? {

??????????????? var behavior = $find('ctl00_ContentPlaceHolder1_MyAccordion_AccordionExtender');

??????????????? if (behavior)? {??????

??????????????????? behavior.set_FadeTransitions(!behavior.get_FadeTransitions());

??????????????? }

??????????? }

??????????? function changeAutoSize()? {

??????????????? var behavior = $find('ctl00_ContentPlaceHolder1_MyAccordion_AccordionExtender');

??????????????? var ctrl = $get('autosize');??? //這里找的是下拉列表控件,不是Behavior

??????????????? if (behavior)? {

??????????????????? var size = 'None';?? // 這里順便看看怎么使用Select

??????????????????? switch (ctrl.selectedIndex)? {

??????????????????????? case 0 :

??????????????????????????? behavior.get_element().style.height = 'auto';

??????????????????????????? size = AjaxControlToolkit.AutoSize.None;

??????????????????????????? break;



??????????????????????? case 1 :

??????????????????????????? behavior.get_element().style.height = '400px';

??????????????????????????? size = AjaxControlToolkit.AutoSize.Fill;

??????????????????????????? break;

??????????????????????? case 2 :

??????????????????????????? behavior.get_element().style.height = '400px';

??????????????????????????? size = AjaxControlToolkit.AutoSize.Limit;

??????????????????????????? break;

??????????????????? }

??????????????????? behavior.set_AutoSize(size);

??????????????? }

??????????????? if (document.focus)? {

??????????????????? document.focus();

??????????????? }

??????????? }
??????? </script>
<ajaxToolkit:Accordion ID="MyAccordion" runat="server" SelectedIndex="0" HeaderCssClass="accordionHeader"

??????????? ContentCssClass="accordionContent" FadeTransitions="false" FramesPerSecond="40"

??????????? TransitionDuration="250" AutoSize="None">

??????????? <Panes>

??????????????? <ajaxToolkit:AccordionPane ID="AccordionPane1" runat="server">

??????????????????? <Header>

??????????????????????? <a href="" οnclick="return false;" class="accordionLink">1. Accordion</a></Header>

??????????????????? <Content>

??????????????????? </Content>

??????????????? </ajaxToolkit:AccordionPane>

??????????? </Panes>

??????? </ajaxToolkit:Accordion>

2. AlwaysVisibleControl

【功能概述】

AlwaysVisibleControl 是一個簡單的擴展控件可以讓一部分內容浮動在頁面上,當滾動頁面或者改變瀏覽器大小時總是可見的。它可以擴展任意一個Asp.net 控件,并可按照要求設置水平 豎直方向上的相對距離.

最多的應用是在線閱讀的目錄和不勝其煩的浮動小廣告。
【細節】

(1)?? 避免控件閃爍,要擴展的控件要使用absolutely position
(2)?? HorizontalSide="Center" VerticalSide="Top" 使用這個方式控制浮動的位置
(3)?? Var label = ocument.getElementById('ctl00_SampleContent_currentTime');這行代?? 碼我們可以使用更簡單的方法:var label = $get('ctl00_SampleContent_currentTime');

【代碼示意】
??? <cc1:AlwaysVisibleControlExtender ID="AlwaysVisibleControlExtender1" HorizontalSide="Center" VerticalSide="Top"? TargetControlID="Panel1" runat="server">


3. Animation

【功能概述】

28個控件種效果最酷的!顧名思義實現動畫效果。它是一個插入式,可擴展的框架可以方便的為你的頁面添加動畫效果。

【細節】

請參考頁面代碼閱讀下面的細節內容:


(1)Sys.UI.DomElement.getLocation(b) 取得控件位置的函數,常用!!!

???? (2)動畫分為兩種:Animation Action 后者的強大讓我很興奮

???? (3)<Sequence>? </Sequence> 順序執行的動畫腳本

???? (4)<Parallel>? <Parallel >? 并發執行的動畫腳本

???? (5)【Action】 <StyleAction AnimationTarget="btnCloseParent" Attribute="opacity" value="0" /> 控制目標元素外觀樣式,屬性--值的格式修改,一個元素可以應用多個StyleAction

???? (6)【Action】<EnableAction AnimationTarget="ctl00_ContentPlaceHolder1_btnInfo" Enabled="true" /> 控件是否可用使用的方式跟上面是一樣的,當前控件可省略AnimationTarget

?? (7)【Action】 <ScriptAction Script="Cover($get('ctl00_ContentPlaceHolder1_btnInfo'), $get('flyout'));" />執行一段腳本的Action????????

??? (8) 【Action】 <HideAction />隱藏目標的控件

??? (9) 【Action】<OpacityAction AnimationTarget="info" Opacity="0" /> 設置透明度的Action

?? (10)【Animation】 <FadeIn AnimationTarget="info" Duration=".2"/>?????? <FadeOut /> 淡入淡出?

? (11)【Animation】<Scale ScaleFactor="0.05" Center="true" ScaleFont="true" FontUnit="px" />??? 控制目標元素的大小但是注意:If scaleFont is true, the size of the font will also scale with the element.? If center is true, then the element's center will not move as it is scaled. It is important to note that the target must be positioned (i.e. absolutely) so that settings its top/left properties will change its location in order for center to have an effect.

???? (12) 【Animation】??? <Pulse Duration=".1" /> 脈搏跳動效果???????

???? (13)【Animation】 <Color Duration=".2" StartValue="#FFFFFF" EndValue="#FF0000" Property="style" PropertyKey="color" />? 顏色漸變效果,設置起始結束顏色就可以

???? (14)? 【Animation】 <Resize Width="260" Height="280" />改變元素的大小Action

(15)動畫效果是在用戶某一個動作發生的時候觸發,觸發的時機包括:OnLoad? OnClick? OnMouseOver OnMouseOut OnHoverOver OnHoverOut

正式版的頁面文件為動畫腳本添加了注釋更加清晰易懂.上面列出的是常用的一些動畫效果,全部資料參見Anmation Reference。

仔細閱讀Animation的頁面代碼,其實我們已經提前觸摸到了Xaml的編程風格。Asp.net Ajax之后的下一代WEB界面是WPF/E,WPF/E現在支持的是”javascript+Xaml” 還不支持”C# + Xaml”。

下一代的WEB UI會是怎樣的?下一個版本的Asp.net 會怎樣安排Ajax的位置?WPF/E會不會被整合在新版本的Asp.net中呢?期待中……


【示意代碼】


代碼示意:

?? <ajaxToolkit:AnimationExtender ID="ae"

? runat="server" TargetControlID="ctrl">

??? <Animations>

??????? <OnLoad>?? </OnLoad>

??????? <OnClick>?? </OnClick>

??????? <OnMouseOver>?? </OnMouseOver>

??????? <OnMouseOut>?? </OnMouseOut>

??????? <OnHoverOver>?? </OnHoverOver>

??????? <OnHoverOut>?? </OnHoverOut>

??? </Animations>

</ajaxToolkit:AnimationExtender>

4. AutoComplete? NEW!!!

【功能概述】
AutoComplete控件是對Asp.net文本框控件的擴展,當用戶詞匯前面的字母時以彈出區域的形式給出備選詞。這個功能的完成依賴于特定的Web Service。

在正式版的Ajax Control Toolkit中看到自動完成擴展控件有一種感覺:它終于出現在了它應該出現的地方。之前AutoComplete控件是在CTP版本中以核心組件的形式出現的,這個功能極為明確的控件被歸類到核心組件,我還是比較迷惑。正式版中它終于成為了一個擴展控件。

Google的自動完成功能,新浪 網易等信箱的收件人自動完成功能是這個功能的成功應用。


【細節】

??? 從Atlas的版本開始,AutoComplete的使用方法就沒有太大的改變,只要注意:

(1)調用的Web Service方法簽名有要求:

?????????? [WebMethod]

?????????? public string[] GetCompletionList(string prefixText, int count) { ... }

???? (2)MinimumPrefixLength最短前綴字符數,就是說你至少要鍵入幾個字符才會出現提示

5. Calendar NEW!!!


【功能概述】

Calendar同樣是對文本框的擴展,當點擊文本框的時候彈出日期選擇選項。現在的版本提供的功能已經和WinForm中的日期控件一樣,可以通過點擊日期選擇,點擊箭頭在年月之間切換。

【細節】

???????? (1)同樣是對文本框的擴展,文本框獲得焦點就會出現日期選擇,樣式是可以自定義的

???????? (2)雖然一定是對文本框的擴展但是我們還是可以指定彈出按鈕PopupButtonID,一旦這個值設定了,文本框獲得焦點也不會彈出日期選擇

???????? (3)不需要把它放在UpdatePanel中

6. CascadingDropDown

【功能概述】

CascadingDropDown 控件是對ASP.NET DropDownList control的擴展,實現對一個DropDownList操作時其它DropDownList發生相應的變化。這個功能的實現依賴于Web Service。

【細節】

(1)如果使用Web service 方法簽名必須符合下面的形式:

??????????????? [WebMethod]

??????????????? public CascadingDropDownNameValue[] GetDropDownContents(

??????????????? string knownCategoryValues, string category){...}

(2)在閱讀代碼的時候請關注:Category屬性。官方說法The name of the category this DropDownList represents 實打開~/App_Data/CarsService.xml你就發現這是Xml的元素標簽。從這個角度我們就解決了為什么聯動,即聯動的本質;同時也明白了調用Service的參數約定。

【示意代碼】?

????? <ajaxToolkit:CascadingDropDown ID="CascadingDropDown1" runat="server" TargetControlID="DropDownList1" Category="Make"? PromptText="Please select a make"? LoadingText="[Loading makes ]"? ServicePath="CarsService.asmx" ServiceMethod="GetDropDownContents"/>

??????????????? <ajaxToolkit:CascadingDropDown ID="CascadingDropDown2" runat="server" TargetControlID="DropDownList2" Category="Model" PromptText="Please select a model" LoadingText="[Loading models ]" ServiceMethod="GetDropDownContentsPageMethod" ParentControlID="DropDownList1"/>

??????????????? <ajaxToolkit:CascadingDropDown ID="CascadingDropDown3" runat="server" TargetControlID="DropDownList3" Category="Color" PromptText="Please select a color" LoadingText="[Loading colors ]" ServicePath="~/CascadingDropDown/CarsService.asmx" ServiceMethod="GetDropDownContents" ParentControlID="DropDownList2"/>?

另外頁面上還有一段定義UpdatePanel的代碼很典型,可以作為參考:?

? <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" RenderMode="inline">

??????????? <ContentTemplate>

??????????????? <asp:Label ID="Label1" runat="server" Text="[No response provided yet]" />

??????????? </ContentTemplate>

??????????? <Triggers>

??????????????? <asp:AsyncPostBackTrigger ControlID="DropDownList3" EventName="SelectedIndexChanged" />

??????????? </Triggers>

??????? </asp:UpdatePanel>

7. CollapsiblePanel

【功能概述】

這個控件幾乎在每一個頁面上都出現了。它是非常靈活的一個控件,可以擴展任何ASP.NET Panel control。在頁面上輕松實現展開收縮效果。這種效果我們最熟悉的恐怕就是XP的文件任務欄了。

【細節】

(1)??? CollapsiblePanel 默認認為使用了 標準 CSS box model 早期的瀏覽器要!DOCTYPE 中設置頁面為自適應方式提交數據rendered in IE's standards-compliant mode.

(2)??? 可以自動展開 自動收縮Autoexpand="true" AutoCollapse="true"但是這兩個本身是互斥的不能同時為True;如果設置了這兩個屬性其中一個為True就不要在設置 Collapsed="True",這樣就沒有意義了。

(3)??? TextLabelID="Label1"這個屬性有什么深意\高級的操作么?我還在研究。。。

代碼示意:

?? <ajaxToolkit:CollapsiblePanelExtender ID="cpe" runat="Server"

??? TargetControlID="Panel1"

??? CollapsedSize="0"

??? ExpandedSize="300"

??? Collapsed="True"

??? ExpandControlID="LinkButton1"

??? CollapseControlID="LinkButton1"

??? AutoCollapse="False"

??? AutoExpand="False"

??? ScrollContents="True"

??? TextLabelID="Label1"

??? CollapsedText="Show Details "

??? OpenedText="Hide Details"

??? ImageControlID="Image1"

??? ExpandedImage="~/images/collapse.jpg"

??? CollapsedImage="~/images/expand.jpg"

??? ExpandDirection="Height"/>

8. ConfirmButton

【功能概述】

這個控件是對Button和繼承了Button的控件的擴展,它可以捕捉到用戶點擊了對話框中的“是”“否”;如果是“是”就繼續執行后面的代碼,反之就停止執行它默認的提交行為。

【細節】

(1) 要擴展的LinkButton Button 以及ConfirmButtonExtender都要放在updatepanel里面

?????? 如果是放在外面,點擊“確定”或者“取消”之后還是會導致頁面刷新!

(2)更簡單的方法:?

? this.Button1.Attributes["onclick"]="javascript:return confirm('確定要停止下載么?');";

(3) 如果是需要服務器端獲取用戶選擇,還是使用模式彈出吧

9.DragPanel

【功能概述】

DragPanel extender可以輕松的讓控件 "draggability".DragPanel 擴展的目標是任意 ASP.NET Panel .你可以設置拖動行為的細節,比如哪里是類似于標題欄一樣的區域。

【細節】

(1)?? TargetControlID 要拖動的控件
(2)??? DragHandleID?? 拖動的標題欄所在的ControlID 示例代碼中: panel6包含panel7(標題) panel8(內容)擴展的對象是panel6 (3)?? 是不是發現這段JS代碼了呢?如果去掉這段代碼,圖到頁面邊緣的時候是不正常的,它自己跑回原來位置了 :)

??????? <script type="text/javascript">

??????? // The following snippet works around a problem where FloatingBehavior

??????? // doesn't allow drops outside the "content area" of the page - where "content

??????? // area" is a little unusual for our sample web pages due to their use of CSS

??????? // for layout.

??????? function setBodyHeightToContentHeight() {

??????????? document.body.style.height = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight)+"px";

??????? }

??????? setBodyHeightToContentHeight();

??????? $addHandler(window, "resize", setBodyHeightToContentHeight);?

??? </script>

【示意代碼】
代碼示意

<ajaxToolkit:DragPanelExtender ID="DPE1" runat="server"

??? TargetControlID="Panel3"

??? DragHandleID="Panel4" />

10. DropDown

【功能概述】

DropDown 同樣是一個 ASP.NET AJAX extender 可以對任何 ASP.NET control 進行擴展實現 SharePoint-style drop-down menu效果。彈出的只不過是其它的panel或者控件而已。?? 在IE瀏覽器中下拉列表總是在最前面的,的確是影響頁面效果,這個控件的出現可以解決這一問題.這隨時隨地的彈出窗口成為WEB 2.0網站的標志性建筑,彈出的東西也越來越豐富。

【細節】

(1)TargetControlID要在什么控件上實現擴展

??? (2)DropDownControlID彈出來什么

(3) 示例中是對一個Label進行的擴展,我試著擴展TextBox效果更好!

【示意代碼】

代碼示意:

? <asp:Panel ID="DropPanel" runat="server" CssClass="ContextMenuPanel" Style="display: none;

??????????? visibility: hidden;">

???????????? <asp:LinkButton runat="server" ID="Option1" Text="Option 1" CssClass="ContextMenuItem"

??????????????? OnClick="OnSelect" />

??????????? <asp:LinkButton runat="server" ID="Option2" Text="Option 2" CssClass="ContextMenuItem"

??????????????? OnClick="OnSelect" />

??????????? <asp:LinkButton runat="server" ID="Option3" Text="Option 3 (Click Me!)" CssClass="ContextMenuItem"

??????????????? OnClick="OnSelect" />

??????? </asp:Panel>

??????? <cc1:DropDownExtender runat="server" ID="DDE" TargetControlID="TextLabel"

??????????? DropDownControlID="DropPanel" />



還有一段代碼有很多可以學習的地方:

代碼示意:

? <asp:UpdatePanel id="Update" runat="server">

??????????? <ContentTemplate>

??????????????? <asp:Label id="lblSelection" runat="server" Style="padding: 5px;" />

??????????? </ContentTemplate>

??????????? <Triggers>

??????????????? <asp:AsyncPostBackTrigger ControlID="Option1" EventName="Click" />

??????????????? <asp:AsyncPostBackTrigger ControlID="Option2" EventName="Click" />

??????????????? <asp:AsyncPostBackTrigger ControlID="Option3" EventName="Click" />

??????????? </Triggers>

??????? </asp:UpdatePanel>

??????? <ajaxToolkit:UpdatePanelAnimationExtender ID="UpdateAnimation" runat="server" TargetControlID="Update" BehaviorID="Highlight">

??????????? <Animations>

??????????????? <OnUpdated>

??????????????????? <Sequence>

??????????????????????? <ScriptAction Script="$find('Highlight')._onUpdated._animation._animations[1].set_target($get('ctl00_ContentPlaceHolder1_lblSelection'));" />

??????????????????????? <Color Duration=".5" StartValue="#FFFF90" EndValue="#FFFFFF" Property="style" PropertyKey="backgroundColor" />

??????????????????? </Sequence>

??????????????? </OnUpdated>

??????????? </Animations>

??????? </ajaxToolkit:UpdatePanelAnimationExtender>

11. DropShadow

【功能概述】

陰影效果

【 細節】

(1)?? Width 單位:px? 默認5px
(2)?? Opacity? 不透明度0-1.0 默認.5

【示意代碼】?

? 代碼示意:

??? <ajaxToolkit:DropShadowExtender ID="dse" runat="server"

??????? TargetControlID="Panel1"

??????? Opacity=".8"

??????? Rounded="true"

??????? TrackPosition="true" />

12. DynamicPopulate

【功能概述】

能實用Web Service或頁面方法來動態的替換控件的內容。調用的方法返回的是一個Html的字符串,作為目標元素的子節點插入其中。

【 細節】

(1)ClearContentsDuringUpdate? 替換之前先清除以前的內容(默認True)

? (2)PopulateTriggerControlID 觸發器綁定的控件 單擊時觸發

? (3)ContextKey傳遞給Web Service的隨機字符串

? (4) Web Service方法簽名必須符合下面的形式:

??????????????? [WebMethod]

??????????????? string DynamicPopulateMethod(string contextKey)

??????????????? {...}

??????????????? Note you can replace "DynamicPopulateMethod" with a naming of your choice, but the return

??????????????? type and parameter name and type must exactly match, including case.

(5) 我們非常欣慰的一點就是BehaviorID="dp1",這種用法是我所期望的。

(6) CustomScript 怎么用呢??This script must evaluate to a string value. ??


【示意代碼】

代碼示意:

<ajaxToolkit:DynamicPopulateExtender ID="dp" runat="server"

??? TargetControlID="Panel1"

??? ClearContentsDuringUpdate="true"

??? PopulateTriggerControlID="Label1"

??? ServiceMethod="GetHtml"

??? UpdatingCssClass="dynamicPopulate_Updating" />?
?????

代碼示意2:

<asp:Panel ID="Panel1" runat="server" CssClass="dynamicPopulate_Normal">

??????? </asp:Panel>? //要擴展的panel

<ajaxToolkit:DynamicPopulateExtender ID="dp" BehaviorID="dp1" runat="server"

????????? ClearContentsDuringUpdate="true"

????????? PopulateTriggerControlID="Label1"

????????? TargetControlID="Panel1"

????????? ServiceMethod="GetHtml"

????????? UpdatingCssClass="dynamicPopulate_Updating">

??? </ajaxToolkit:DynamicPopulateExtender>

??? <script runat="server">?

??? [System.Web.Services.WebMethod]

??? [System.Web.Script.Services.ScriptMethod]

??? public static string GetHtml(string contextKey)? {

??????? // a little pause to mimic a latent call.

??????? //

??????? System.Threading.Thread.Sleep(250);



??????? string value = "";

??????? if (contextKey == "U")? {

??????????? value = DateTime.UtcNow.ToString();

??????? } else? {

??????????? value = String.Format("{0:" + contextKey + "}", DateTime.Now);

??????? }?

??????? return String.Format("<span style='font-family:courier new;font-weight:bold;'>{0}</span>", value);

??? }

</script>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

<script? type="text/javascript">?
??? function updateDateKey(value)? {?

??????? var behavior = $find('dp1'); //這樣使用BehaviorID可是方便多了

??????? if (behavior)? {

??????????? behavior.populate(value);// 內部實現調用了Service

??????? }?

??? }?

??? Sys.Application.add_load(function() {updateDateKey('G');});? //頁面加載時要執行的腳本!
</script>

13. FilteredTextBox

【功能概述】

FilteredTextBox擴展控件用來阻止用戶在文本框輸入無效字符 。由于這種效果的實現是依賴于deactivating JavaScript(怎么翻譯呢?),所以不要期望數據會發送到服務器端進行校驗。

【細節】

(1)過濾條件Numbers LowercaseLetters UppercaseLetters?? Custom
(2)過濾條件也可以是Custom的組合 FilterType="Custom, Numbers"?
??? (3)ValidChars="+-=/*()." Custom要定義這樣的有效字符串

(4)這個控件我認為是聊勝于無,我們要把允許輸入的數據進行枚舉,太難了。事實上,這個控件在任何狀態下都是接受中文的。如果使用正則表達式情形或許好些。看它的實現代碼還有進一步改進的可能,學習研究中……

【示意代碼】

示意代碼:

<ajaxToolkit:FilteredTextBoxExtender ID="ftbe" runat="server"

??????? TargetControlID="TextBox3"????????

??????? FilterType="Custom, Numbers"

??????? ValidChars="+-=/*()." />

在該控件的實現代碼中我發現了這樣一段,這可能是一個突破口:

特殊鍵排除代碼:

<?? var scanCode;

??????????????????????? if (evt.rawEvent.keyIdentifier) {?
?????????

??????????? // Safari

??????????? // Note (Garbin): used the underlying rawEvent insted of the DomEvent instance.

??????????? if (evt.rawEvent.ctrlKey || evt.rawEvent.altKey || evt.rawEvent.metaKey) {

??????????????? return;

??????????? }?
???????????
??????????? if (evt.rawEvent.keyIdentifier.substring(0,2) != "U+") {

??????????????? return;

??????????? }?
?????????

??????????? scanCode = evt.rawEvent.charCode;?
??????????

??????????? if (scanCode == 63272 /* Delete */) {

??????????????? return;

??????????? }

??????? }

??????? else {

??????????? scanCode = evt.charCode;

??????? }

??????????

??????? if (scanCode && scanCode >= 0x20 /* space */) {??????????????

??????????? var c = String.fromCharCode(scanCode);??????????????????????

??????????

??????????? if(!this._processKey(c)) {

??????????????? evt.preventDefault();

??????????? }

??????? }

??? }?

??
14. HoverMenu?
????????

【功能概述】

HoverMenu控件可以擴展任何 ASP.NET WebControl, 同時將把附加的顯示內容關聯到該控件上,當用戶移動鼠標到該控件的時候附加的內容將顯示出來。

【細節】

(1)?? PopupControlID要彈出來什么

(2)PopupPostion 在哪里彈出來Left (Default), Right, Top, Bottom, Center.

(3)OffsetX/OffsetY 彈出項與源控件的距離

(4) PopDelay 彈出延時顯示 單位milliseconds. Default is 100.

【代碼示意】

代碼示意:

<ajaxToolkit:HoverMenuExtender ID="hme2" runat="Server"

??? TargetControlID="Panel9"

??? HoverCssClass="popupHover"

??? PopupControlID="PopupMenu"

??? PopupPosition="Left"

??? OffsetX="0"

??? OffsetY="0"

??? PopDelay="50" />
示例頁面上還有一個小細節:
HttpUtility.HtmlEncode()使用 HttpUtility.HtmlEncode 將危險的符號轉換為它們的 HTML 表示形式。

代碼示意:

????? <asp:Label Font-Bold="true" ID="Label1" runat="server" Text='<%# HttpUtility.HtmlEncode(Convert.ToString(Eval("Title"))) %>'></asp:Label></td>

???? <asp:Label ID="Label2" runat="server" Text='<%# HttpUtility.HtmlEncode(Convert.ToString(Eval("Description"))) %>'></asp:Label></td>

???????????????? <asp:Label ID="Label3" runat="server" Text='<%# Eval("Priority") %>'></asp:Label>


15. MaskedEdit NEW!!!?

【功能概述】

MaskedEdit 控件是對TextBox control的擴展.用戶輸入會在客戶端進行驗證。在示例頁面中,我感覺實際效果并不是太好所以沒有深入學習,不多說了。

16. ModalPopup

【功能概述】


ModalPopup 擴展控件允許在頁面上模式彈出內容并阻止用戶和頁面上其他區域的交互。模式彈出區域的樣式都是可以自定義的。 用戶可以在模式彈出框選擇OK/Cancel,對用戶選擇的處理方式有兩種:使用客戶端腳本或者PostBack到服務器端。這樣我們就得到了用戶的選擇結果!


【細節】


(1)?? 看下面的代碼可以看到執行客戶端腳本的方法。

(2)?? 應該說這個控件是提供了一個模式彈出對話框的模板

(3)?? 在正式版以前的所有版本,這個控件在Opear瀏覽器中都是不正常的。正式版已經修正這個BUG,現在正在比較學習兩個版本的源代碼,看看問題的原因和解決方法是什么。

【示意代碼】

代碼示意:

? <asp:Panel ID="Panel2" runat="server" CssClass="modalPopup" style="display:none">

??????? <p>

??????????? <asp:Label ID="Label1" runat="server" BackColor="Blue" ForeColor="White" Style="position: relative"

??????????????? Text="信息提示"></asp:Label>&nbsp;</p>

??????? <p >確定要刪除當前下載的任務么?</p>

??????? <p style="text-align:center;">

??????? <asp:Button ID="Button1" runat="server" Text="OK" ></asp:Button>

??????? <asp:Button ID="Button2" runat="server" Text="Cancel"></asp:Button>

??????? </p>

??? </asp:Panel>

??? <ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender" runat="server" TargetControlID="LinkButton1"

??? PopupControlID="Panel2" BackgroundCssClass="modalBackground" DropShadow="true"

??? OkControlID="Button1" OnOkScript="onOk()" CancelControlID="CancelButton" />


17. MutuallyExclusiveCheckBox

【功能概述】


互斥復選框就像RadioButton一樣,應用的場景是:“a number of choices are available but only one can be chosen”

【細節】



(1)Key屬性用來分組就像RdiolistGroup一樣

??????????????? (2)argetControlID用來綁定已有的CheckBox



【代碼示意】

?????????????? <ajaxToolkit:MutuallyExclusiveCheckboxExtender runat="server"

??? ID="MustHaveGuestBedroomCheckBoxEx"

??? TargetControlID="MustHaveGuestBedroomCheckBox"

Key="GuestBedroomCheckBoxes" />



18. NoBot


【功能概述】



提供了簡單的Captcha 圖靈測試 用來屏蔽bot/spam 垃圾信息。是一個反垃圾信息控件。我查了一下資料,我的理解是:比如你點擊一個按鈕需要一秒鐘的時間,而這一秒鐘的時間你不可能再做其他的操作比如再點一次;這樣區分出了人和機器。避免機器人自動點擊 注冊 暴力破解之類的事情

? 【 細節】

(1)OnGenerateChallengeAndResponse 這個屬性是EventHandler<NoBotEventArgs> 調用服務器端的方法,注意方法簽名

?????????????????????? 例如:?? protected void CustomChallengeResponse(object sender, NoBotEventArgs e) {……}

【示意代碼】


代碼示意:

??? <ajaxToolkit:NoBot

? ID="NoBot2"

? runat="server"

? OnGenerateChallengeAndResponse="CustomChallengeResponse"

? ResponseMinimumDelaySeconds="2"

? CutoffWindowSeconds="60"

? CutoffMaximumInstances="5" />

NoBot控件拒絕垃圾發布程序

10.1 NoBot:拒絕機器人程序

NoBot 控件可以為頁面中的表單提供類似CAPTCHA[注釋1]而卻無需任何用戶操作的驗證,以阻止機器人程序自動提交垃圾信息。



10.1.1 應用場景

網 絡上的垃圾信息似乎無處不在,從前是垃圾郵件、廣告等。而現在,這些無孔不入的垃圾信息發布者又盯上了互聯網上的各大網站。各種機器人程序(Bot)應運 而生,它們可以自動在網絡上爬行并尋找帶有評論或留言功能的頁面,隨即自動填寫表單并提交,其提交垃圾信息的數量和質量更是讓傳統的手工發布者自愧不如。管理者往往一夜之間發現自己的網站下已經多了成千上萬條廣告,不但讓真正有用的信息淹沒于其中,更是讓網站在性能上不堪重負。

由此,很 多解決方法同樣應運而生,其中最著名的當屬各種驗證圖片了。這種驗證圖片中的文字由計算機隨機生成,并盡其所能地對其進行扭曲、變形、修飾、模糊,最終要達到的目的是只有聰明的人類才能夠分析出其中的內容(如圖10-1所示),而當前水平的計算機卻只能夠望“圖”興嘆。然后將用戶對這幅圖片的識別文本隨表 單一起發送至服務器。這樣,服務器即可通過檢查客戶端輸入的識別文字的正確與否來判斷這是否是人類所為,也就達到了區分機器人程序和人類的目的。

圖10-1 極其復雜的驗證圖片

目 前為止,這種做法非常有效,因為計算機圖像處理能力的發展還不足以完全正確地識別出如此復雜的圖片中的文字。不過這樣做的缺點也很明顯——麻煩!每次提交 一次表單都需要用戶仔細睜大雙眼分辨驗證圖象中的內容,并且輸入一串毫無意義、沒有任何連貫性的字符,真的是一種痛苦!而且,對于視力不便的殘障人士來說,這種驗證圖片更是將其拒之門外。

于是,某些網站提供了另外一種可選項,即對于視力不便的殘障人士,可以選擇聽一段朗讀,并輸入其中讀過的字母,通過聲音的方式來分辨人類和計算機,例如Hotmail的注冊頁面,如圖10-2所示。

圖10-2 以識別聲音的方式來分辨人類和計算機

這樣似乎考慮得很周全了……不過,如果某個用戶不懂得英文,那豈不還是不能使用么?世界上有這么多種語言,難道要提供每種語言的版本?而且,即使提供了所有語言的版本,對于麻煩這個致命的問題,也仍舊是無法解決啊!

有沒有一種無需用戶操作的,對用戶完全透明的驗證機器人程序的解決方法呢?ASP.NET AJAX Control Toolkit中提供的NoBot控件即提供了這樣一種相對來說比較折衷的解決方案。



10.1.2 聲明語法以及常用屬性

NoBot控件可以通過如下四種方式較為準確地判斷出進行當前操作的是否為人類:

?? 1. 讓 客戶端瀏覽器執行一段JavaScript,并判斷其執行結果。機器人程序一般只是取得HTTP流的內容,對其分析并填寫其中表單之后即提交,這個過程中 并不包含對瀏覽器功能的使用,也就更不會解析并運行頁面中的JavaScript得到正確的運行結果。且這段JavaScript既可以是一段簡單的純數 學運算,例如123*4455=?,也可以是一些非常復雜的DOM操作,例如動態創建一個<div>,并返回它的位置等。這樣即強迫該程序只 能夠在瀏覽器中使用,大多數機器人程序顯然對此等計算無力回天。
?? 2. 判斷客戶端是否保存了本次會話狀態。一般來講,只有瀏覽器才會對會話狀態進行關注并保存,而簡單的機器人程序則會完全忽略會話狀態信息。
?? 3. 判斷客戶端從開始接受頁面到提交表單的時間間隔。機器人程序都比較講究“效率”,加上計算機的強大運算能力,幾乎可以在接收到頁面之后的瞬間就完成表單的填寫并提交回服務器。而對于人類,顯然不可能在如此短暫的幾秒鐘時間之內就完成這樣復雜的一張表單。
?? 4. 判斷某段時間之內某個客戶端的提交次數。同樣,對于人類來說,沒有能力也沒有意義在比如一分鐘之內填寫同樣的表單100次,而對于機器人程序,則這很有可能是它們的一貫作風。

以上的四種方法,雖不能百分之百地完全阻止機器人程序,然而在大多數情況下還是非常有效且相當精確的。且使用這種方法最大的優勢就在于它省去了對用戶交互的需要,讓程序更加友好易用。

NoBot控件在頁面中是完全不可見的,這似乎和我們潛意識中Ajax程序的那些眩目的界面效果沒什么關系。不過從增強用戶體驗的角度來看,NoBot卻的確是一大進步,它也正符合了Ajax的最根本設計目標——提高用戶體驗。

聲明NoBot控件的語法將類似如下所示:

<ajaxToolkit:NoBot

??? ID="noBot"

??? runat="server"

??? ResponseMinimumDelaySeconds="2"

??? CutoffWindowSeconds="60"

??? CutoffMaximumInstances="5"

??? OnGenerateChallengeAndResponse="noBot_GenerateChallengeAndResponse" />

NoBot控件繼承于System.Web.UI.WebControls.CompositeControl,并間接繼承于 System.Web.UI.WebControls.WebControl,也就擁有了這些控件的所有屬性/方法/事件,聲明NoBot控件時所常用的屬性標簽如表10-1所示。

表10-1 聲明NoBot控件時的常用屬性標簽[注釋2]

?? 1. ResponseMinimumDelaySeconds: 一個合理的客戶端從開始接受頁面到提交表單的時間間隔,單位為秒。在該時間段之內的提交將被認為是機器人所為。
?? 2. CutoffWindowSeconds:指定一個統計同一客戶端提交次數的窗口時間段,單位為秒。在該時間段之內的提交次數超過CutoffMaximumInstances所指定的值將被認為是機器人所為。
?? 3. CutoffMaximumInstances:指定在窗口時間段內同一客戶端最多的提交次數。在CutoffWindowSeconds所指定的時間段之內的提交次數超過該值將被認為是機器人所為。
?? 4. OnGenerateChallengeAndResponse:指定GenerateChallengeAndResponse事件的處理函數。在該事件處理函數中我們可以設定強制瀏覽器執行的一段JavaScript以及其預期的執行結果。若瀏覽器的執行結果和預期結果不符,則本次提交將被認為是機器人所為。

10.1.3 示例程序:阻止機器人程序的提交

NoBot控件雖然設置起來比較簡單,但對其進行合理的配置卻并不容易,檢查標準太高或太低均難以達到我們的預期目標。接下來讓我們通過一個示例程序來分析討論該控件的使用方法。

首先在新建的頁面中添加ScriptManager控件,然后添加一個TextBox和一個Button,用來模擬出一個最簡單的輸入表單,再加入一個Label,用來顯示機器人程序檢測是否通過的信息:

<asp:TextBox ID="tbSomething" runat="server"></asp:TextBox>

<asp:Button ID="btnSubmit" runat="server" Text="Submit" />

<asp:Label ID="lbResult" runat="server"></asp:Label>

接下來是NoBot控件的聲明:

<ajaxToolkit:NoBot ID="noBot" CutoffWindowSeconds="10" CutoffMaximumInstances="2"

? ResponseMinimumDelaySeconds="2"

? OnGenerateChallengeAndResponse="noBot_GenerateChallengeAndResponse"

? runat="server" />

我們先來看ResponseMinimumDelaySeconds屬性,在該示例程序中,因為表單非常簡單,只有一個域,我們將其設置為較短的2 (秒)。在實際開發中,我們應該根據表單的復雜程度估計用戶填寫需要的時間,并相應地配置該屬性。例如,對于如Hotmail中復雜的用戶注冊表單來講, 將該屬性值設置為100秒都不足為過——在100秒之內能夠將該注冊頁面填寫完成的,除了機器人程序也只有天才了。

對于CutoffWindowSeconds屬性,這里我們設置為10(秒)。該屬性值越大,則統計的時間段也就越長,判斷結果也就愈加有信服力,但同時這樣也會造成服務器端更大的開銷。一般情況下,將該屬性設置為10-100是一個比較合理的選擇。

對于CutoffMaximumInstances屬性,這里我們設置為2(次),配合CutoffWindowSeconds屬性,其含 義即為在10秒鐘之內同一個客戶端最多可以提交2次,超過該次數的提交均被認為是機器人程序。在考慮設置該屬性時,我們也要考慮表單的復雜程度并相應地估 計用戶填寫所需要的時間。

而對于OnGenerateChallengeAndResponse屬性,即 GenerateChallengeAndResponse事件的處理函數,我們將在其中設定強制瀏覽器執行的JavaScript以及預期的結果,這里將其指定為noBot_GenerateChallengeAndResponse(),函數的名稱無關緊要,讓開發人員能夠理解就好。該事件處理函數的簽名如下:

protected void noBot_GenerateChallengeAndResponse(object sender, NoBotEventArgs e)

注意其中的類型為NoBotEventArgs的參數e,將在稍后用到。在該函數中,我們將動態生成一個隨機大小的<div>并添加到 頁面的DOM樹中,且將該<div>的長寬乘積作為預期值保存起來。同時將向頁面中寫入一段JavaScript,該JavaScript用 來在客戶端運行時找到該<div>并取得其長寬的乘積。這樣在頁面回送之后,NoBot控件就可以通過比較預期值與從客戶端得到的實際值是否 相等來判斷客戶端是否為真正的瀏覽器,進而判斷客戶端是否為機器人。

在noBot_GenerateChallengeAndResponse()方法中,首先新建一個ASP.NET Panel,選擇Panel是因為該控件將被呈現為HTML <div>元素,方便得到其長寬屬性:

Panel noBotPanel = new Panel();

接下來,生成兩個隨機數,將分別設置到該Panel的長和寬屬性上:

Random rand = new Random();

int width = rand.Next(80);

int height = rand.Next(120);

隨后,為這個Panel指定一個隨機的ID,指定ID是為了讓之后的JavaScript中可以在客戶端取到其生成的<div>,而選用隨機的ID是為了讓程序更加具有不確定性,進一步迷惑機器人程序:

noBotPanel.ID = string.Format("noBotPanel{0}", rand.Next(1000));

然后將上面生成的長、寬應用到該Panel上:

noBotPanel.Width = width;

noBotPanel.Height = height;

為了不干擾頁面的現有布局,我們還要設置一下該Panel的樣式,將其隱藏起來:

noBotPanel.Style.Add(HtmlTextWriterStyle.Visibility, "hidden");

noBotPanel.Style.Add(HtmlTextWriterStyle.Position, "absolute");

注意第一句實際上是設置了visibility: hidden;,而并沒有選擇我們常用的display: none;。因為若選用后者,則瀏覽器將認為其大小為0。

然后將該Panel添加為NoBot的子控件,同樣是為了避免可能出現的對頁面結構的影響:

(sender as NoBot).Controls.Add(noBotPanel);

然后設置將在瀏覽器中執行的這一段檢驗的JavaScript:

e.ChallengeScript = string.Format("var noBotPanel = document.getElementById('{0}'); noBotPanel.offsetWidth * noBotPanel.offsetHeight;", noBotPanel.ClientID);

注意到這段JavaScript在運行時將首先通過該Panel的客戶端ID得到其實際<div>元素的引用,然后使用 offsetWidth和offsetHeight得到其實際大小,并將其乘積返回。這段JavaScript賦值給了 e.ChallengeScript,即NoBotEventArgs類型對象的ChallengeScript屬性上。

最后設置上面這段JavaScript的預期運行結果,非常簡單:

e.RequiredResponse = (width * height).ToString();

需要注意的是要將預期運行結果賦值給e.RequiredResponse,即NoBotEventArgs類型對象的RequiredResponse屬性。

這樣,若客戶端為真正的瀏覽器的話,則設置于e.ChallengeScript中的這段JavaScript將正常執行,并如我們所料地返回和e.RequiredResponse中完全一樣的預期結果。若是二者不匹配,則即可認為該客戶端為忽略了JavaScript的機器人程序。

完整的noBot_GenerateChallengeAndResponse()代碼如下:

protected void noBot_GenerateChallengeAndResponse(object sender, NoBotEventArgs e)

{

??? Panel noBotPanel = new Panel();



??? Random rand = new Random();



??? int width = rand.Next(80);

??? int height = rand.Next(120);



??? noBotPanel.ID = string.Format("noBotPanel{0}", rand.Next(1000));

??? noBotPanel.Width = width;

??? noBotPanel.Height = height;

??? noBotPanel.Style.Add(HtmlTextWriterStyle.Visibility, "hidden");

??? noBotPanel.Style.Add(HtmlTextWriterStyle.Position, "absolute");



??? (sender as NoBot).Controls.Add(noBotPanel);



??? e.ChallengeScript = string.Format("var noBotPanel = document.getElementById('{0}'); noBotPanel.offsetWidth * noBotPanel.offsetHeight;", noBotPanel.ClientID);



??? e.RequiredResponse = (width * height).ToString();

}

接下來同樣需要編寫的還有Page_Load()函數,其中我們將使用NoBot控件進行驗證。因為只有在回送時才有驗證的必要,所以我們忽略掉頁面第一次加載的情況:

protected void Page_Load(object sender, EventArgs e)

{

??? if (IsPostBack)

??? {

??????? ……

??? }

}

我們將在上述代碼中滿足IsPostBack的條件下編寫我們的驗證代碼。在其中新建一個NoBotState類型的枚舉,NoBot控件的驗證結果就將存放于該枚舉中:

NoBotState state;

NoBotState枚舉的可選值有如下幾種:

?? 1. Valid:表示驗證通過。
?? 2. InvalidBadResponse:表示前面自定義的JavaScript腳本(即e.ChallengeScript)的運行結果和預期結果(即e.RequiredResponse)不符,驗證失敗。
?? 3. InvalidResponseTooSoon:表示客戶端完成表單的時間小于ResponseMinimumDelaySeconds所指定的時間,驗證失敗。
?? 4. InvalidAddressTooActive:表示客戶端在CutoffWindowSeconds指定的窗口時間內的請求超過了CutoffMaximumInstances所指定的數量,驗證失敗。
?? 5. InvalidBadSession:表示會話狀態驗證失敗,可能是客戶端并沒有保存會話狀態,驗證失敗。
?? 6. InvalidUnknown:未知錯誤,驗證失敗。

然后將該NoBotState枚舉的引用傳遞到NoBot控件的IsValid()方法中,該方法將返回一個布爾值,代表驗證是否成功。同時,傳遞 進入的NoBotState也將被設定為相應的枚舉值。這樣,我們即可通過分辨IsValid()方法的返回值判斷驗證是否成功,并作以相應操作:

if (noBot.IsValid(out state))

{

??? ……

}

else

{

??? ……

}

在驗證通過時,我們將給出一個示例性的提示:

lbResult.Text = "您的信息已經被提交!";

若驗證失敗,則將同樣給出詳細的錯誤提示:

string errorMessage = string.Empty;

switch (state)

{

??? case NoBotState.InvalidAddressTooActive :

??????? errorMessage = "該IP地址在短時間內提交了過多的請求。";

??????? break;

??? case NoBotState.InvalidBadResponse :

??????? errorMessage = "瀏覽器中檢測腳本未被運行或運行結果不正確。";

??????? break;

??? case NoBotState.InvalidBadSession :

??????? errorMessage = "ASP.NET會話狀態不可用。";

??????? break;

??? case NoBotState.InvalidResponseTooSoon :

??????? errorMessage = "兩次回送時間間隔過短。";

??????? break;

??? case NoBotState.InvalidUnknown :

??????? errorMessage = "未知錯誤。";

??????? break;

}

lbResult.Text = string.Format("請求被拒絕,原因:{0}", errorMessage);

出于演示的目的,上述代碼才如此耐心地對原因一一解釋。在實際的應用程序中,我們完全沒有必要如此的“友善”,簡單地提示“懷疑為機器人程序”即 可,或是更加干脆地用Response.End()結束本次HTTP會話,給機器人程序以顏色,也免得讓其了解我們程序中更多的NoBot實現細節。

作為參考,下面列出Page_Load()函數的完整代碼:

protected void Page_Load(object sender, EventArgs e)

{

??? if (IsPostBack)

??? {

??????? NoBotState state;

??????? if (noBot.IsValid(out state))

??????? {

??????????? lbResult.Text = "您的信息已經被提交!";

??????? }

??????? else

??????? {

??????????? string errorMessage = string.Empty;

??????????? switch (state)

??????????? {

??????????????? case NoBotState.InvalidAddressTooActive :

??????????????????? errorMessage = "該IP地址在短時間內提交了過多的請求。";

??????????????????? break;

??????????????? case NoBotState.InvalidBadResponse :

??????????????????? errorMessage = "瀏覽器中檢測腳本未被運行或運行結果不正確。";

??????????????????? break;

??????????????? case NoBotState.InvalidBadSession :

??????????????????? errorMessage = "ASP.NET會話狀態不可用。";

??????????????????? break;

??????????????? case NoBotState.InvalidResponseTooSoon :

??????????????????? errorMessage = "兩次回送時間間隔過短。";

??????????????????? break;

??????????????? case NoBotState.InvalidUnknown :

??????????????????? errorMessage = "未知錯誤。";

??????????????????? break;

??????????? }

??????????? lbResult.Text = string.Format("請求被拒絕,原因:{0}", errorMessage);

??????? }

??? }

}

這樣即完成了本示例程序,編譯并在瀏覽器中查看該頁面,將如圖10-3所示。

圖10-3 初始化的表單

在文本框中輸入一些文字,確保等待了2秒鐘之后再提交頁面,將看到“您的信息已經被提交!”驗證通過信息,如圖10-4所示。

圖10-4 驗證通過

迅速再點一下提交(2秒鐘之內),將看到如圖10-5所示的“請求被拒絕,原因:兩次回送時間間隔過短。”驗證失敗信息。

圖10-5 兩次回送時間間隔過短,驗證失敗

若是在10秒鐘之內提交次數超過兩次,將看到如圖10-6所示的“請求被拒絕,原因:該IP地址在短時間內提交了過多的請求。”驗證失敗信息。

圖10-6 同一IP地址在短時間內提交了過多的請求,驗證失敗

若是在瀏覽器中禁用了的JavaScript,則將看到如圖10-7所示的“請求被拒絕,原因:瀏覽器中檢測腳本未被運行或運行結果不正確。”驗證失敗信息。

圖10-7 瀏覽器中檢測腳本未被運行或運行結果不正確,驗證失敗



10.1.4 常見問題以及使用技巧

NoBot可以完全代替傳統的驗證圖片么?

不可以。按照當前的計算機技術來看,驗證圖片將始終是最為精確的、無可替代的辨別機器人程序和真正用戶的最佳方法。對于NoBot控件所采用的判斷 規則,機器人程序均能夠通過某種方式進行模擬并巧妙地繞開。且由于NoBot控件需要統計過多的信息,例如某個時間段內每個IP的提交次數、每個頁面的提交時間間隔等,也會在某種程度上影響服務器端的執行效率。同時,若NoBot控件配置不當,或是用戶使用某些不支持JavaScript的瀏覽器(例如移 動設備中的瀏覽器),則極易導致較高的誤判斷率乃至根本無法通過驗證,反而影響了用戶體驗。

而若是配置得當且服務器端資源充沛,則NoBot控件的優勢也非常明顯。所以,在選擇合適的驗證方法時,上述問題均要結合實際應用場景考慮周全,并做出恰當的決定。

如何選擇強制瀏覽器執行的JavaScript,即ChallengeScript?

由于這段JavaScript難以調試,所以應該盡可能的簡單。同時,為了避免機器人程序的成功預測,其中也要包含相當的不確定性。由此,前面示例程序中演示的創建<div>并檢測其高度和寬度的乘積的方法非常適合:既足夠簡單,也有著相當的隨機性,足夠讓機器人程序難以捉摸。

[1]CAPTCHA即Completely Automated Public Turing Test to Tell Computers and Humans Apart(全自動的公開圖靈測試),其目的是讓計算機生成區分計算機和人類的程序算法,這種程序必須能夠生成并評價出人類能很容易通過但計算機卻難以通過的測試。目前常見的驗證圖片等都屬于CAPTCHA。若想了解更多,請訪問“The CAPTCHA Project”網站:http://www.captcha.net/。

[2] ID屬性起到控件標志符的作用,我們都很熟悉,限于篇幅這里不贅。下同。

19. NumericUpDown

【功能概述】

實現Winform里面的Updown控件,可以自定義最大值最小值增減步長,同時還可以使用值列表或者調用Web Service來決定下一個值是什么。上下按鈕的圖片同樣是可以自定義的。?
?? 【細節】


(1)普通整數增減

?????????????? (2)值列表循環顯示比如下面的第二個例子RefValues

??????????????? (3)調用Web Service的格式:?????????????



<ajaxToolkit:NumericUpDownExtender ID="NUD1" runat="server"

??? TargetControlID="TextBox1"

??? Width="100"

??? RefValues="January;February;March;April"

??? TargetButtonDownID="Button1"

??? TargetButtonUpID="Button2"

??? ServiceDownPath="WebService1.asmx"

??? ServiceDownMethod="PrevValue"

??? ServiceUpPath="WebService1.asmx"

??? ServiceUpMethod="NextValue"

??? Tag="1" />



(4)上下按鈕如果不需美化就這樣使用:TargetButtonDownID=" " TargetButtonUpID=" "


【示意代碼】

代碼示意:

?????????? <ajaxToolkit:NumericUpDownExtender ID="NumericUpDownExtender1" runat="server"

??????????????????? TargetControlID="TextBox1" Width="120" RefValues=""

??????????????????? ServiceDownMethod="" ServiceUpMethod="" TargetButtonDownID="" TargetButtonUpID="" />

??????????????? <ajaxToolkit:NumericUpDownExtender ID="NumericUpDownExtender2" runat="server"

??????????????????? TargetControlID="TextBox2" Width="120" RefValues="January;February;March;April;May;June;July;August;September;October;November;December"

??????????????????? ServiceDownMethod="" ServiceUpMethod="" TargetButtonDownID="" TargetButtonUpID="" />

?????????????????????? <ajaxToolkit:NumericUpDownExtender ID="NumericUpDownExtender4" runat="server"

??????????????????? TargetControlID="TextBox4" Width="80" TargetButtonDownID="img1"

??????????????????? TargetButtonUpID="img2" RefValues="" ServiceDownMethod="" ServiceUpMethod="" />


20. PagingBulletedList

【功能概述】

PagingBulletedList 擴展BulletedList的分頁功能并實現客戶端的排序分頁。這里提供的分頁是相當靈活的有各種分頁方法供選擇。?

?? 【細節】


(1)可以控制每頁最多顯示多少條,是否排序

(2)IndexSize表示index headings 的字符數,如果MaxItemPerPage設置了概屬性被忽略

(3)MaxItemPerPage分頁每頁最大條數


【示意代碼】



代碼示意:

<ajaxToolkit:PagingBulletedListExtender ID="PagingBulletedListExtender1" BehaviorID="PagingBulletedListBehavior1" runat="server"

??????????????????? TargetControlID="BulletedList1"

??????????????????? ClientSort="true"

??????????????????? IndexSize="1"

??????????????????? Separator=" - "

??????????????????? SelectIndexCssClass="selectIndex"

??????????????????? UnselectIndexCssClass="unselectIndex" />



21. PasswordStrength

【功能】

驗證密碼強度,微軟Live注冊的時候就是用的這個效果。

【細節】

StrengthIndicatorType兩種顯示方式:文字提示,進度條提示。

示例中Textbox1 Textbox3都沒有添加TextMode="Password" 所以在界面上我們可以輸入中文;而且輸入中文很快就達到較高安全度,當然這沒有什么用處。

【示意代碼】


代碼示意:

<ajaxToolkit:PasswordStrength ID="PasswordStrength1" runat="server" DisplayPosition="RightSide" TargetControlID="TextBox1"

??????????????????? StrengthIndicatorType="Text" PreferredPasswordLength="10" PrefixText="Strength:"

??????????????????? HelpStatusLabelID="TextBox1_HelpLabel" TextCssClass="TextIndicator_TextBox1"? TextStrengthDescriptions="Very Poor;Weak;Average;Strong;Excellent"

??????????????????? MinimumNumericCharacters="0" MinimumSymbolCharacters="0" RequiresUpperAndLowerCaseCharacters="false"/>

??? <ajaxToolkit:PasswordStrength ID="PasswordStrength2" runat="server" DisplayPosition="RightSide" TargetControlID="TextBox2"

??????????????????? StrengthIndicatorType="BarIndicator" PreferredPasswordLength="15" HelpStatusLabelID="TextBox2_HelpLabel"

???????????????????? BarIndicatorCssClass="BarIndicator_TextBox2" BarBorderCssClass="BarBorder_TextBox2"

???????????????????? MinimumNumericCharacters="1" MinimumSymbolCharacters="1" RequiresUpperAndLowerCaseCharacters="true" />

??? <ajaxToolkit:PasswordStrength ID="PasswordStrength3" runat="server" DisplayPosition="BelowLeft" TargetControlID="TextBox3"

??????????????????? StrengthIndicatorType="Text" PreferredPasswordLength="20" PrefixText="Meets Policy? " TextCssClass="TextIndicator_TextBox3"

???????????????????? MinimumNumericCharacters="2" MinimumSymbolCharacters="2" RequiresUpperAndLowerCaseCharacters="true"

???????????????????? TextStrengthDescriptions="Not at all;Very Low compliance;Low Compliance;Average Compliance;Good Compliance;Very High Compliance;Yes"

???????????????????? HelpHandleCssClass="TextIndicator_TextBox3_Handle" HelpHandlePosition="LeftSide" />

22.PopupControl

【功能概述】

PopupControl任何控件上都可以彈出任何內容,跟HoverMenu功能類似。Popup 窗口一般是放在ASP.NET AJAX UpdatePanel中, 因此它能夠完成服務器端的處理之后更能新數據
顯示. Popup Window 可以包含任何內容包括 ASP.NET server controls, HTML elements, etc.

【細節】

(1)TargetControlID - The ID of the control to attach to

??????????????? (2)PopupControlID - The ID of the control to display

??????????????? (3)CommitProperty -屬性來標識返回的值

??????????????? (4) CommitScript -把返回結果值通過腳本處理,用到CommitProperty



? 【代碼示意】

????? <ajaxToolkit:PopupControlExtender? ID="PopupControlExtender2" runat="server" TargetControlID="MessageTextBox"

????? PopupControlID="Panel2" CommitProperty="value" CommitScript="e.value += ' - do not forget!';" Position="Bottom" />

23.Rating

【功能概述】

使用星級表示等級,鼠標操作;

【細節】

鼠標移動等級也會變,而你真正要修改還要點擊一下;這是延續了WP10里面等級評定控件的傳統,也許這樣設計是真的有道理,我不清除。

【示意代碼】?

? 代碼示意:

?? <ajaxToolkit:Rating ID="ThaiRating" runat="server"

??? CurrentRating="2"

??? MaxRating="5"

??? StarCssClass="ratingStar"

??? WaitingStarCssClass="savedRatingStar"

??? FilledStarCssClass="filledRatingStar"

??? EmptyStarCssClass="emptyRatingStar"

??? OnChanged="ThaiRating_Changed" />?

?? 24.ReorderList

【功能概述】

ReorderList是一個全新的控件。它可以實現逐條列出數據并實現交互。用戶簡單的拖拽就可以改變數據的排列順序并更新到數據源。在本控件中如果SortOrderField 屬性設置之后排序將自動完成。

【細節】

(1)綁定數據,拖動數據之后數據將被更新到綁定源

??????????????? (2)它不是已有控件的擴展是全新的服務器端控件,只是它對Ajax行為是敏感的

??????????????? (3)重排的實現有兩種方式:CallBack PostBack 前者的發生在頁面上是沒有PostBack的(也就是沒有刷新頁面)

??????????????? (4) 而數據添加或者編輯的時候就必須要使用PostBack來同步服務器端的數據狀態

??????????????? (5)PostbackOnReorder就是針對兩種策略進行選擇

【示意代碼】

代碼示意:

?? <ajaxToolkit:ReorderList ID="ReorderList1" runat="server"

??? DataSourceID="ObjectDataSource1"

??? DragHandleAlignment="Left"

??? ItemInsertLocation="Beginning"

??? DataKeyField="ItemID"

??? SortOrderField="Priority"

??? AllowReorder="true">

????? <ItemTemplate> </ItemTemplate>

????? <ReorderTemplate> </ReorderTemplate>

????? <DragHandleTemplate> </DragHandleTemplate>

????? <InsertItemTemplate> </InsertItemTemplate>

</ajaxToolkit:ReorderList>

這個控件是非常獨立,并且還是適用于表現Buleted的數據,二維數據就無能為例了

??????????? DataSourceID="ObjectDataSource1" 這是必須要有的!下面是它的Template框架:?

? <ajaxToolkit:ReorderList ID="ReorderList1" PostBackOnReorder="false" runat="server" DataSourceID="ObjectDataSource1" CallbackCssStyle="callbackStyle"

??????? DragHandleAlignment="Left" ItemInsertLocation="Beginning" DataKeyField="ItemID" SortOrderField="Priority">

??????? <ItemTemplate></ItemTemplate>

??????? <EditItemTemplate></EditItemTemplate>

??????? <ReorderTemplate></ReorderTemplate>

??????? <DragHandleTemplate> </DragHandleTemplate>

??????? <InsertItemTemplate> </InsertItemTemplate>

</ajaxToolkit:ReorderList>

25. ResizableControl

【功能概述】

就像設計狀態一樣可以拖動修改大小,可是有什么實際的意義么,放大字體?沒有想到

【 細節】

(1)?? HandleCssClass - The name of the CSS class to apply to the resize handle 這個屬性必須要有!
(2)?? WEB2.0時代用戶什么都是可以自定義的??難道是這個原則下的產物么??不理解

(3)?? 在前衛的飛鴿網站上我都一直沒有看到關于ResizableControl的應用,期待一個成功的應用

【示意代碼】?
? 代碼示意:

<ajaxToolkit:ResizableControlExtender ID="RCE" runat="server"

??? TargetControlID="PanelImage"

??? HandleCssClass="handleImage"

??? ResizableCssClass="resizingImage"

??? MinimumWidth="50"

??? MinimumHeight="20"

??? MaximumWidth="260"

??? MaximumHeight="130"

??? OnClientResize="OnClientResizeImage"

??? HandleOffsetX="3"

??? HandleOffsetY="3" />?

?26. RoundedCorners

【功能】

控件圓角 純粹是控制外觀的了,什么時候審美疲勞了還要改。據說GUI風格也是N年一輪回,這讓我想起來了一個27KB的QQ,命令行界面,真的是這樣么?穿孔紙帶據說是第一代GUI,不會有一天真的回到那個時代吧?

?? 【細節】

(1)還有一個非常非常細節的地方:你必須要設置 CssClass="roundedPanel"要不然不起作用

??????????????? (2) Radius設置弧度,默認是5

??????????????? (3)只適用于容器 WebControl?
?????? 【示意代碼】

代碼示意:

????????????? <ajaxToolkit:RoundedCornersExtender ID="rce" runat="server"???? TargetControlID="Panel1"???? Radius="6" />
27. Slider

【功能概述】

實現WinForm中的Slider控件效果,新浪論壇用來分頁了,還有的用來調整“時間----------|----熱度”,創意!

? 【細節】
(1)?? 修改文本框的值也可以影響Slider的狀態

【示意代碼】?

? 代碼示意:

????????????? <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>????????????????????????????

??? <cc1:SliderExtender ID="SliderExtender2" runat="server"

??????????????????????????????? BehaviorID="Slider2"

??????????????????????????????? TargetControlID="Slider2"

??????????????????????????????? BoundControlID="TextBox1"

??????????????????????????????? Orientation="Horizontal"

??????????????????????????????? EnableHandleAnimation="true"

???????????????????????????????? Minimum="0"

??????????????????????????????? Maximum="100"

??????????????????????????????? />

28. Tabs NEW!!!

Tabs是我認為這一次新增控件中最實用的好東東, 在編碼風格上與所有嵌套式的控件一樣:

?????????? <ajaxToolkit:TabContainer runat="server"

??????? OnClientActiveTabChanged="ClientFunction"

??????? Height="150px">

??? <ajaxToolkit:TabPanel runat="server"

??????? HeaderText="Signature and Bio"

??????? <ContentTemplate>

??????????? ...

??????? </ContentTemplate>

??? />

</ajaxToolkit:TabContainer>

Demo效果讓我們很容易想到最近改版之后的網頁主頁和新浪主頁 和Accordion比較一下各有千秋,是對經典WinForm的一種繼承。

29 .TextBoxWatermark
【功能概述】

對文本框進行擴展,文本水印效果。

看了幾十個WEB2.0的網站,沒想到,見到最多的就是這種水印效果,看來很受歡迎。

【示意代碼】

代碼示意:

??? <asp:TextBox ID="TextBox1" CssClass="unwatermarked" Width="150" runat="server"></asp:TextBox>

??????????? <cc1:TextBoxWatermarkExtender ID="TextBoxWatermarkExtender1" runat="server" TargetControlID="TextBox1" WatermarkText="請輸入用戶名" WatermarkCssClass="watermarked" />


30. ToggleButton

【功能概述】

就是把一個CheckBox的邏輯應用到一個按鈕上,于是就有了雙態按鈕這么個玩意,有點意思啊

實際上示例頁面并沒有突出這個控件功能上的優勢,對這個控件的操作引起頁面上數據的更新,這才是CheckBox控件封裝成Button的最終原因。

【示意代碼】

<asp:CheckBox ID="CheckBox1" Checked="true" Text="I like ASP.NET" runat="server"/>

??? <cc1:ToggleButtonExtender ID="ToggleButtonExtender1" runat="server" TargetControlID="CheckBox1" ImageWidth="19"

???? ImageHeight="19" UncheckedImageUrl="Image/down.gif" CheckedImageUrl="Image/up.gif" CheckedImageAlternateText="Check"

???? UncheckedImageAlternateText="UnCheck" />

31.UpdatePanelAnimation

【功能概述】

更新動畫效果,個人認為應用于時間較短的場合,時間長了這個動畫就有點不合適了,畢竟這是一個過渡效果;時間長還是UpdateProgress比較好。?

?? 【細節】


代碼結構簡單但是要說的東西很多,回頭再說寫專題吧

代碼示意:

? <ajaxToolkit:UpdatePanelAnimationExtender ID="ae"

? runat="server" TargetControlID="up">

???? <Animations>

??????? <OnUpdating>?? </OnUpdating>

??????? <OnUpdated>?? </OnUpdated>

??? </Animations>

</ajaxToolkit:UpdatePanelAnimationExtender>


32. ValidatorCallout


【功能概述】


Windows系統中最常見的氣泡提示,比如你磁盤空間不足的時候。是對數據驗證控件的擴展,比較實用,頁面效果的確是比以前那

轉載于:https://www.cnblogs.com/liangsetian/archive/2011/06/02/2068707.html

總結

以上是生活随笔為你收集整理的Ajax Control Toolkit 32个服务器端控件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

最新免费中文字幕 | 人人澡超碰碰97碰碰碰软件 | 午夜精品一区二区三区在线视频 | 天天干天天插伊人网 | 精品在线视频观看 | 国产成人亚洲在线观看 | 在线免费黄色毛片 | 日韩精品一区二区三区免费观看视频 | av丝袜天堂 | 天天干干 | 国产 日韩 欧美 中文 在线播放 | 日本在线视频一区二区三区 | 91手机电视 | www免费| 98久9在线 | 免费 | 婷婷国产一区二区三区 | 国产一二三在线视频 | 高清不卡免费视频 | 久久久免费 | 成人av在线直播 | 性色在线视频 | 国产手机在线观看视频 | 欧美日韩精品网站 | www.国产视频| 狠狠干天天射 | 国产一级视频在线观看 | 欧美va在线观看 | 日韩久久一区 | 99超碰在线观看 | 日本九九视频 | 91香蕉视频黄 | 黄色小说网站在线 | 国产精品久久精品国产 | 国产高清在线免费视频 | 久久成人国产精品一区二区 | 91探花在线| 久热精品国产 | 欧美国产不卡 | 黄色国产大片 | www.亚洲激情.com | 午夜 在线 | 青青草视频精品 | 亚洲影院天堂 | 97精品在线 | 日韩电影在线视频 | a色视频 | 国产精品第二页 | 又长又大又黑又粗欧美 | 国产小视频免费在线观看 | 黄色三级在线观看 | 四虎国产精品免费观看视频优播 | 黄色91在线 | 91精品视频导航 | 久久激情视频网 | 91九色免费视频 | 国产成人精品一区二区三区在线 | 国产又粗又长又硬免费视频 | 午夜久久久久久久久久久 | 亚洲无吗天堂 | 国产精品1区2区3区在线观看 | 不卡视频一区二区三区 | 极品国产91在线网站 | 亚洲天堂色婷婷 | 欧美aaa视频| 中文字幕在线观看视频一区 | 日韩久久久久久 | 免费在线观看av网址 | 人人舔人人干 | 人人爽人人乐 | 国产中文字幕免费 | 久要激情网 | 可以免费看av| 亚洲免费在线看 | 亚洲成人精品国产 | 欧美91视频 | 国产中文字幕在线看 | 久久国产精品久久精品 | 狠色狠色综合久久 | 久久国产精品久久久久 | avav99| 精选久久| 在线免费观看国产精品 | 性色xxxxhd| 成人免费视频网 | 国产精品精品久久久久久 | 日韩网站一区二区 | 在线亚洲激情 | 日韩欧美一区二区三区在线观看 | 精品极品在线 | 99这里有精品 | 国产精品手机在线 | 91爱爱免费观看 | 婷婷草| 亚洲一区二区精品在线 | 天天爽天天搞 | 免费av网站在线看 | 高潮久久久久久久久 | 99在线精品视频在线观看 | 国产精品国产自产拍高清av | 五月丁香 | 精品视频成人 | 91av视频免费观看 | 在线看片一区 | 丁香婷婷射 | 一区二区三区四区五区在线 | 黄色av免费电影 | 亚洲国产片 | 天天干天天色2020 | 国产黄色看片 | 日韩三级视频在线观看 | 久久国产香蕉视频 | www.狠狠操 | 成人在线视频观看 | 欧美日韩国产一区二 | 91视频国产高清 | 一区二区三区视频网站 | 深爱激情五月网 | 一区二区av | 中文字幕中文字幕在线中文字幕三区 | 天天射,天天干 | 麻豆传媒视频在线 | 欧美日韩二区三区 | 日韩中文字幕免费 | 91最新视频在线观看 | 国产91精品一区二区 | 黄色一级大片在线观看 | 国产午夜精品久久 | 91久久奴性调教 | 久久黄色影院 | www.久久爱.cn | 黄色av电影 | av青草| 日韩成人黄色 | 中文字幕在线免费看线人 | 欧美一级片免费 | 懂色av一区二区三区蜜臀 | 久久老司机精品视频 | 成人影片免费 | 69人人| www.国产视频 | 在线高清 | 欧美精品一区二区免费 | 91人人爽人人爽人人精88v | 99中文字幕视频 | 国产精品成人免费一区久久羞羞 | 丁香六月综合网 | 中文字幕av在线播放 | 国产在线观看 | 精品久久久99 | 人人干网| 久久久久久久综合色一本 | 四虎国产精品免费观看视频优播 | 夜夜躁天天躁很躁波 | 久久综合精品一区 | 丁香视频免费观看 | 国产精品久久久久久久久久久久午夜 | 男女拍拍免费视频 | 美女中文字幕 | 99r在线播放| 黄网站污 | 一区二区三区四区不卡 | 在线观看va | 人人干在线 | 国产精品免费看久久久8精臀av | av成人免费观看 | 日韩欧美高清一区二区 | 色婷婷综合视频在线观看 | 久久无码av一区二区三区电影网 | 成人国产精品久久久久久亚洲 | 国产高清在线视频 | 69精品在线观看 | 国产福利精品一区二区 | 久久九九精品 | 黄色av成人在线 | 久久精品99北条麻妃 | 欧美日韩二区三区 | 精品视频999 | 国产精品国产三级国产 | 日韩成年视频 | 在线之家免费在线观看电影 | 亚洲视频资源在线 | 欧美一级电影片 | 69国产成人综合久久精品欧美 | 色综合久久久久综合99 | 四虎免费在线观看视频 | 免费午夜av | 久草电影免费在线观看 | 91麻豆操| 91爱爱中文字幕 | 黄色片免费电影 | 狠狠ri| 在线播放国产一区二区三区 | 日本99热 | 亚洲美女免费精品视频在线观看 | 国产精品18久久久久久久网站 | 色综合天天综合 | 色av男人的天堂免费在线 | 国产精品福利无圣光在线一区 | 成人宗合网| 免费日韩 精品中文字幕视频在线 | 久久精品中文字幕免费mv | 超碰97国产在线 | 国产欧美精品一区二区三区四区 | 成人av网址大全 | 日韩专区 在线 | 九九九免费视频 | 婷婷5月激情5月 | 国产精品免费看 | 国产精品久久久影视 | 久久影院午夜论 | 一区二区三区中文字幕在线 | 高清av中文在线字幕观看1 | av久久在线| 91亚洲狠狠婷婷综合久久久 | 小草av在线播放 | 精品一区二区免费视频 | 色综合天天干 | 久久综合婷婷 | 麻豆激情电影 | 日韩大片在线播放 | 欧美精品在线一区二区 | 爱爱一区 | 91久久国产自产拍夜夜嗨 | 免费看黄色91 | 天天插天天色 | 亚洲成熟女人毛片在线 | 91人人爱| 久久亚洲国产精品 | 欧美日韩高清一区 | 亚洲成人av在线电影 | aaaaaa毛片 | 曰韩精品 | 日韩国产欧美在线视频 | 99久久99视频 | 日本黄色免费播放 | 天天操人人要 | 国产在线观看高清视频 | 人人射人人射 | 肉色欧美久久久久久久免费看 | 一区二区伦理电影 | 久久久精品电影 | 久久久一本精品99久久精品66 | 黄色小说视频在线 | 久久精品中文字幕 | 97超碰资源总站 | 色视频成人在线观看免 | 亚洲专区视频在线观看 | 美女久久 | 国精产品999国精产品岳 | 99久久精品免费看国产 | 99视频在线精品国自产拍免费观看 | 亚洲精品久久久久999中文字幕 | 91一区啪爱嗯打偷拍欧美 | 久久观看免费视频 | 99久久精品国产欧美主题曲 | 欧美一级电影片 | 日韩高清免费电影 | 欧美日韩不卡在线视频 | 日韩免费一区二区 | 一级a毛片高清视频 | 国产一区二区精品久久 | 日本中文字幕在线视频 | 日一日操一操 | 日本少妇高清做爰视频 | 中文字幕在线视频一区二区三区 | 欧美与欧洲交xxxx免费观看 | 国产亚洲精品中文字幕 | 久久成人一区 | 亚洲在线黄色 | 中文免费观看 | 色婷婷www| 亚洲一片黄 | 欧美与欧洲交xxxx免费观看 | 色婷婷精品 | 国内成人综合 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 在线有码中文 | 人人看人人艹 | 99久久99久久免费精品蜜臀 | 成人免费共享视频 | 精品国产一区在线观看 | 蜜臀av性久久久久蜜臀av | 热re99久久精品国产99热 | 99久久婷婷国产 | av网址aaa | 成人免费视频网站 | 亚洲3级 | 色综合五月天 | 欧美日韩亚洲在线 | 在线免费观看羞羞视频 | 国产中文字幕国产 | 午夜精品一区二区国产 | 欧美黑人巨大xxxxx | 国产a精品 | 最近免费观看的电影完整版 | 在线观看你懂的网站 | 欧美极品xxxx | 中中文字幕av在线 | 日产乱码一二三区别在线 | 国产福利一区在线观看 | 国产视频一区在线 | 蜜桃av综合网 | 黄色一级影院 | 久草视频手机在线 | 日韩视频图片 | 国产一区二区三区久久久 | 欧美性极品xxxx娇小 | 六月激情久久 | 五月天六月色 | 91视频网址入口 | 日本在线观看中文字幕 | 成片视频在线观看 | 99在线精品视频在线观看 | 成人av在线亚洲 | 久草视频资源 | 国产成人av网 | 国产性天天综合网 | 亚洲情感电影大片 | 国产精品中文在线 | 最新日韩电影 | 国产小视频在线播放 | adn—256中文在线观看 | 日韩国产精品久久 | 日日干狠狠操 | 欧美影院久久 | 国产免费一区二区三区最新 | 最近免费观看的电影完整版 | 久久av伊人 | 精品一区二三区 | 国产精品久久久久9999 | 波多野结衣精品视频 | 国产成人精品久久二区二区 | 日韩精品不卡在线 | 国产欧美日韩一区 | 99精品视频在线观看播放 | 色综合久久网 | 亚洲精品在线观看网站 | 亚洲精品乱码久久久一二三 | 国产精品女人久久久 | 成人久久18免费 | 操久在线| 国产精品久久久久久久免费大片 | 国产中文字幕在线免费观看 | 亚洲视频分类 | 91三级在线观看 | 国产又粗又猛又爽 | 久久久久国产成人精品亚洲午夜 | 久久99最新地址 | 成人97视频一区二区 | 探花视频在线版播放免费观看 | 五月婷婷久久综合 | 国产欧美日韩一区 | 亚洲第一区在线观看 | 成人黄色小视频 | 五月婷婷狠狠 | 欧美一级特黄aaaaaa大片在线观看 | 日韩有码在线播放 | 国产91成人在在线播放 | 欧美日韩亚洲在线观看 | 亚洲一级片免费观看 | 深夜成人av | 国产中文字幕在线免费观看 | 98久久| 久久久 精品 | 狠狠操夜夜 | 成人国产网站 | 九九色视频 | 天天亚洲综合 | 一区在线观看 | 欧美黑人巨大xxxxx | 国产福利91精品一区 | 日本一区二区三区视频在线播放 | 国产在线 一区二区三区 | 丁香六月在线观看 | 日韩高清 一区 | 免费看亚洲毛片 | 亚洲精品中文字幕视频 | 免费看黄20分钟 | 婷婷国产一区二区三区 | 久久久九九 | 国产福利免费看 | 欧美日韩不卡在线视频 | 精品免费久久 | 国产不卡高清 | 国产亚洲精品久久久久久移动网络 | av免费看在线 | 国产精品女人久久久 | 国产视频一区在线免费观看 | 国产精品都在这里 | 日韩免费福利 | 国内视频一区二区 | 欧美久久99 | 天天干夜夜擦 | 久久一久久 | 日韩精品视频第一页 | 久久er99热精品一区二区三区 | 99精品免费在线观看 | 国产精品久久久久一区二区三区共 | 日日操天天爽 | 99国产精品一区 | 黄色中文字幕 | 日韩精品一区二区三区高清免费 | 久艹视频在线观看 | 日韩欧美一区二区三区在线 | 成人资源在线播放 | 狠狠操狠狠干天天操 | 日本公妇色中文字幕 | 精品黄色在线 | 日本中文字幕系列 | 五月天亚洲综合小说网 | 91精品久久久久久久久久入口 | 国产裸体无遮挡 | 久久人人插 | 激情开心网站 | 精品96久久久久久中文字幕无 | 国产九九在线 | 成人xxxx | av在线播放快速免费阴 | 国产精品久久久久久久久久ktv | 在线观看中文字幕视频 | 狠狠色噜噜狠狠狠狠2021天天 | 国产精品18久久久久久首页狼 | 中文字幕视频网 | 国产手机视频在线观看 | 亚洲精品在线播放视频 | 亚洲干视频在线观看 | 成人动漫一区二区三区 | 日韩r级电影在线观看 | 久久久久久在线观看 | 欧美日韩视频免费看 | 日本黄色免费在线 | 婷婷视频在线播放 | 久久久久久久免费观看 | 欧美性生活小视频 | 中文字幕中文字幕在线一区 | 91麻豆精品国产91久久久更新时间 | 97人人模人人爽人人少妇 | 久精品一区 | 久久九九国产精品 | 亚洲激情视频在线观看 | 日韩成人在线一区二区 | 国产区第一页 | 在线观看免费 | 91香蕉视频在线下载 | 五月婷婷中文网 | 亚洲精品中文字幕视频 | 91天堂影院 | 久久成人黄色 | www.91av在线 | 又黄又爽又刺激的视频 | 亚洲国产日韩一区 | 国产精品一区二区三区电影 | 中文字幕av一区二区三区四区 | 天天草天天操 | 日韩特黄一级欧美毛片特黄 | 日韩在线第一 | 午夜视频免费 | 国产成人精品久久亚洲高清不卡 | japanesefreesex中国少妇 | 久久99精品久久久久久三级 | 波多野结衣在线观看一区二区三区 | 在线观看视频在线 | 日韩国产精品一区 | 亚洲高清在线视频 | 午夜精品久久久久久中宇69 | 91香蕉亚洲精品 | 成人国产电影在线观看 | 性色av香蕉一区二区 | 在线亚洲高清视频 | 成人va天堂 | 久久久不卡影院 | 久久精品日本啪啪涩涩 | 六月丁香色婷婷 | 四虎国产精品免费 | 日韩欧美91 | 国产中文字幕视频在线 | 亚洲欧美精品在线 | 91视频免费国产 | 在线观看电影av | 久久久久美女 | 成人黄色电影免费观看 | 九九久久视频 | 国产一区二区在线免费播放 | 日韩三级av | 色综合五月| 免费色婷婷 | 99在线观看视频 | 一区二区三区在线视频111 | 国产小视频网站 | 国产这里只有精品 | 精品国产精品国产偷麻豆 | 在线99热| 国产精品青青 | 国产精品永久在线 | 激情网站五月天 | 国产香蕉在线 | 久久久国产影视 | 久久综合五月天 | 伊人天天色 | 欧美极品一区二区三区 | 91精品国自产在线观看欧美 | 婷婷六月中文字幕 | 大荫蒂欧美视频另类xxxx | 麻豆精品视频在线 | 成人av资源网站 | 国产玖玖精品视频 | 久久九精品 | 看黄色.com| 久久婷婷丁香 | 国产午夜在线观看视频 | 亚洲aⅴ免费在线观看 | 国内精品视频久久 | 夜夜躁日日躁狠狠躁 | 又黄又爽免费视频 | 国产香蕉视频在线观看 | 国产网站av | 日韩中文字幕亚洲一区二区va在线 | 亚洲欧美视频在线播放 | 亚洲视频在线播放 | 在线看片中文字幕 | 激情综合交 | 免费观看一级成人毛片 | 色干综合 | 欧美一二区在线 | 成人黄在线 | 人人干免费 | 五月黄色 | 日韩国产精品久久 | 欧美日韩不卡在线 | 亚洲国产欧美在线人成大黄瓜 | 最近乱久中文字幕 | 精品一区中文字幕 | 精品视频资源站 | 免费在线观看成年人视频 | www.久久久久| 国产精品久久久久久久久免费 | 久久国产精品免费视频 | 欧美一级小视频 | 亚洲国产日韩精品 | 99精品免费久久久久久久久 | 91亚洲精品久久久蜜桃 | 99精品区 | 午夜少妇一区二区三区 | 六月婷婷久香在线视频 | 黄色av大片 | 国产精品mm | 亚洲人xxx | 久久久久久久影视 | 五月天免费网站 | 日日操天天操狠狠操 | 一级精品视频在线观看宜春院 | 精品国产一区二区三区四区在线观看 | 天天干天天操天天干 | 国产麻豆精品在线观看 | 美女黄频网站 | 九精品 | 91精品日韩| 亚洲激色 | 久久久国产精品成人免费 | 四虎影视成人永久免费观看亚洲欧美 | 国产一区二区三区在线免费观看 | 精品三级av | 欧美视频网址 | 91传媒激情理伦片 | 最近中文字幕大全中文字幕免费 | 欧美日韩亚洲在线 | 狠狠操狠狠插 | 超碰国产人人 | 久久久九色精品国产一区二区三区 | 亚洲精品在线一区二区 | 欧美激情综合五月色丁香 | 中文字幕 91 | 亚洲精品美女在线观看播放 | 玖玖色在线观看 | 中文字幕不卡在线88 | 久久成人免费视频 | 91网站在线视频 | 成人一区二区三区中文字幕 | 毛片一级免费一级 | 超碰人人干人人 | 欧美激情精品久久久久久变态 | 一区二区精品视频 | 视频在线观看99 | 久草在线视频免费资源观看 | 久久久九色精品国产一区二区三区 | 欧美日韩中 | 精品视频成人 | 欧美视频99| 99视频精品免费观看, | 成人免费视频播放 | 国产一级性生活视频 | 黄污在线看 | 日韩av影视在线 | 少妇高潮流白浆在线观看 | av一级片网站 | 99久久精品国产欧美主题曲 | 免费日韩一级片 | 午夜精品三区 | 福利片视频区 | 日韩专区在线播放 | avhd高清在线谜片 | 久久精品这里热有精品 | 久久午夜网 | 国产中文字幕在线观看 | 91视频首页 | 久久福利 | 久久久激情网 | 啪啪免费试看 | 97精品欧美91久久久久久 | 国产呻吟在线 | 人人舔人人爽 | 亚洲黄色免费电影 | 美女在线国产 | 色999视频| 一本色道久久综合亚洲二区三区 | 成人午夜免费福利 | 三级黄色在线观看 | 国产日产精品一区二区三区四区的观看方式 | 久久久色 | 久草在线电影网 | 丁香综合| av成人免费 | 精品福利视频在线观看 | 91欧美在线 | 91九色在线视频观看 | 国产精品va在线观看入 | 91九色pron| 成人毛片网 | 精品国产乱码久久久久久1区2匹 | 色搞搞| 久久国产高清 | 日韩理论电影网 | 国产在线观看国语版免费 | 亚洲国产精品va在线 | 中文字幕在线观看免费高清电影 | 国产亚洲亚洲 | 99精品免费久久久久久日本 | 91久久久久久久一区二区 | 大胆欧美gogo免费视频一二区 | 色狠狠狠 | 天堂av一区二区 | 不卡视频一区二区三区 | 91视视频在线直接观看在线看网页在线看 | 久久tv视频 | 中文字幕中文字幕在线中文字幕三区 | 色小说在线 | 色多多视频在线观看 | 一级片免费在线 | 久久不射电影院 | 国产操在线 | 日韩欧美高清 | 在线观看视频亚洲 | 一本到视频在线观看 | 日韩中文字幕视频在线观看 | 99婷婷 | 亚洲第一色 | 国产精品一区二区电影 | 91精选在线观看 | 亚洲人成人在线 | 人人爽人人澡人人添人人人人 | 日韩欧美视频免费看 | 国产精品大尺度 | 国产亚洲精品久久久久久久久久 | 国产一区二区三区四区大秀 | 91精品啪在线观看国产 | 五月天婷亚洲天综合网精品偷 | 日韩在线视频精品 | 国产一区二区三区视频在线 | 日韩欧美成 | av电影亚洲 | 热久久99这里有精品 | 最近最新中文字幕 | 欧美一级性视频 | 日韩理论片 | 精品无人国产偷自产在线 | 国产色视频| 狠狠色网 | 中文字幕一区二区三区在线观看 | 久久伦理 | 亚洲国产精品女人久久久 | 欧美日本国产在线观看 | 激情欧美一区二区三区免费看 | 最新国产在线视频 | 国产免费高清视频 | 天堂av观看 | 99精品视频在线免费观看 | 成人综合日日夜夜 | 久久精品视频国产 | 97狠狠操| 国产人在线成免费视频 | 日韩在线观看你懂的 | 在线观看国产日韩 | 精品免费久久久久久 | 九九一级片 | 天天色天天干天天色 | 国内久久精品 | 欧美激情综合色综合啪啪五月 | 中文在线字幕免费观 | 免费福利片 | 日本久久视频 | 亚洲色图22p | 正在播放五月婷婷狠狠干 | 中文资源在线官网 | 啪啪免费观看网站 | 欧美日韩综合在线观看 | 黄色免费网站 | 国产h片在线观看 | 99在线精品免费视频九九视 | 中文字幕黄色 | 中文乱码视频在线观看 | 日韩视频在线不卡 | 国产视频欧美视频 | 91麻豆精品国产午夜天堂 | 五月激情六月丁香 | 狠狠插天天干 | 亚洲人成网站精品片在线观看 | 国产精品 欧美 日韩 | 亚洲另类交 | 偷拍精偷拍精品欧洲亚洲网站 | 91精品国产99久久久久久久 | 天天干天天弄 | 久久大视频 | 国产美女视频 | 欧美性色综合网站 | 97国产超碰在线 | 国产一二三区av | 国产成人高清 | 日韩成人免费在线电影 | 福利视频入口 | 久久综合狠狠狠色97 | 黄色国产精品 | 亚洲人成人在线 | av成人免费在线观看 | 在线观看国产区 | 99 精品 在线| 国产精品久久99综合免费观看尤物 | 日韩在线首页 | 免费看日韩片 | 肉色欧美久久久久久久免费看 | 亚洲人成网站精品片在线观看 | 在线观看黄色大片 | 久草在线资源观看 | 久久乐九色婷婷综合色狠狠182 | 免费网站看av片 | av日韩中文| 91精品在线免费视频 | 日韩欧美一级二级 | 91成人看片 | 成人av片在线观看 | 奇米影音四色 | 国产精品久久久久久久午夜 | 免费高清在线视频一区· | 国产第一福利网 | 成人久久18免费网站 | 一区二区三区四区五区在线 | 欧美日韩首页 | 久久综合五月天婷婷伊人 | 欧美日本在线视频 | 欧美一二三视频 | 99视频在线免费播放 | 国产高清 不卡 | 一级片视频在线 | 男女日麻批 | 最新色站| 成人黄性视频 | 91丨九色丨国产丨porny精品 | 久久96国产精品久久99软件 | 四虎8848免费高清在线观看 | 丁香久久婷婷 | 国产欧美在线一区 | 久久最新视频 | 四虎影院在线观看av | 久久精品这里精品 | 国产精品久久久久久五月尺 | 欧美日韩性 | 日日操天天操夜夜操 | 综合激情网 | 国产精品自产拍在线观看桃花 | 欧美国产精品一区二区 | 免费观看全黄做爰大片国产 | 欧美老女人xx | 欧美激情综合五月色丁香小说 | 99r在线 | 日日日日干 | 免费观看视频的网站 | 中文字幕在线免费看 | www.精选视频.com | 五月婷婷视频在线 | 久久99九九99精品 | 97视频在线观看成人 | 国产精品99久久久精品免费观看 | 婷婷中文字幕 | 日韩大片免费观看 | 久久国产精品小视频 | 热久久视久久精品18亚洲精品 | 99视频在线看 | 成年人毛片在线观看 | 免费看毛片在线 | 国产在线播放一区二区 | 精品国产乱码久久久久久三级人 | 国产又粗又猛又爽又黄的视频免费 | 国产一区二区在线播放 | 91在线视频播放 | 色综合久久久久久中文网 | www.夜夜骑.com| 国产精品理论视频 | 日韩欧美在线免费观看 | 中文字幕色综合网 | 亚欧日韩成人h片 | 国产一级一级国产 | 欧美一区二区在线刺激视频 | 欧美日韩国产在线精品 | 在线99 | 日韩精品资源 | 亚洲人成人在线 | 国产成人精品久久 | 免费看国产a | 日本在线视频网址 | 69视频网站 | 91免费视频网站在线观看 | 日韩专区在线观看 | 五月婷婷视频在线观看 | 91av电影| 亚洲视频在线免费看 | 久久精品日本啪啪涩涩 | 欧美一级免费黄色片 | 99精品乱码国产在线观看 | 国产在线视频一区二区 | 人人天天夜夜 | 亚洲美女免费精品视频在线观看 | 91av片| 天天插天天干天天操 | 婷婷午夜 | 91色视频 | 日日干精品 | 人人舔人人 | 狠狠干成人 | 国产一区不卡在线 | 免费合欢视频成人app | 玖草影院| 91亚洲精品乱码久久久久久蜜桃 | 免费黄色av片 | 天天操 夜夜操 | 成年人视频在线观看免费 | 午夜精品久久久久久久久久久久久久 | 成年人视频在线免费 | 久久99久久99精品 | 四虎在线免费视频 | 中文字幕高清在线播放 | 日本黄色片一区二区 | 在线视频 日韩 | 国产91精品在线播放 | 欧美一级性生活 | 日韩亚洲国产精品 | 91精品夜夜 | 久久国内精品视频 | 国产精品毛片久久久久久 | 免费观看高清 | 日本久久久影视 | 色综合久久精品 | 国产黄影院色大全免费 | 在线亚洲精品 | 国产精品成人品 | 中文字幕丝袜制服 | 国产视频久 | 手机在线日韩视频 | 婷婷六月综合亚洲 | 久99视频| 999在线精品 | 黄色三级在线观看 | 国产精品mv在线观看 | 九草视频在线 | 久久午夜国产精品 | 欧美视频一区二 | 日日夜夜网 | 99久久综合狠狠综合久久 | 91网站在线视频 | 国产高清亚洲 | 一区二区三区四区五区六区 | 久久精品视频网址 | 亚洲涩涩网站 | 亚洲视频免费 | 91豆花在线观看 | 麻豆视频在线观看免费 | 97av超碰 | 午夜视频福利 | 在线观看黄色免费视频 | 国产精品一区二区白浆 | 成人小视频在线 | 特级西西444www大精品视频免费看 | a级片网站| 超碰在线最新地址 | 国产精品v欧美精品 | 中国一区二区视频 | 日本亚洲国产 | 久久免费精品一区二区三区 | 亚洲资源在线观看 | 成年人天堂com | 免费看av片网站 | 欧美一区视频 | 91精品国自产在线观看 | 中文国产字幕在线观看 | 中文字幕一区二区在线播放 | 国产一区二区精 | 久久天天躁狠狠躁亚洲综合公司 | 69久久99精品久久久久婷婷 | 免费看片网址 | 亚洲成色777777在线观看影院 | 日韩簧片在线观看 | 麻豆视频在线免费看 | 日韩精品一区二区三区免费视频观看 | 九九免费在线观看视频 | 免费观看性生活大片 | 91视频国产高清 | 国产手机在线观看 | 色综合久久久久综合99 | 久久公开视频 | 99爱在线观看| 国内一区二区视频 | 亚洲一区日韩在线 | 人人爽人人搞 | 国产91对白在线播 | 国产亚洲精品久久久久动 | 成人午夜影院 | 国产精品激情在线观看 | 午夜久久福利视频 | 狠狠操操 | 激情丁香5月 | 黄色一级在线视频 | 欧美做受高潮 | av专区在线 | 国产欧美中文字幕 | 午夜在线免费视频 | 久久视频99 | av无限看| 中文字幕精 | 日韩一二三区不卡 | 综合国产在线观看 | 免费一区在线 | 深爱激情亚洲 | 久久草在线视频国产 | 国产精品美女视频 | 日韩中文字幕免费视频 | 在线亚洲欧美视频 | 欧美精品一区二区免费 | 精品一区二区免费 | 一区二区三区 亚洲 | 97超碰在线人人 | 免费福利片 | 日韩欧美区 | 欧美性生活小视频 | 人人澡av| 国产一二三四在线视频 | 日本一区二区免费在线观看 | 中文字幕 国产视频 | 91av视频| 亚洲国产中文字幕在线视频综合 | 丁香婷婷成人 | 91免费观看视频网站 | 亚洲久草在线 | 热re99久久精品国产66热 | 日日爱网址| 精品国产免费人成在线观看 | av免费网 | 在线视频91 | 国内精品久久久久影院男同志 | 国产黄色大片 | www色婷婷com| 激情婷婷丁香 | 国产资源网站 | 天天狠狠操 | 视频在线日韩 | 高清在线一区二区 | 亚洲欧美视频一区二区三区 | 日韩欧美视频一区二区三区 | 在线va网站 | 久久久久国产成人免费精品免费 | 免费在线观看av网址 | 午夜精品福利在线 | 日韩欧美电影网 | 亚洲国内精品 | 毛片在线网 | 亚洲九九九在线观看 | a√天堂中文在线 | 精品999久久久 | 成人小视频在线播放 | 狠狠操狠狠操 | 一区二区三区精品在线视频 | 欧美一区二区三区免费看 | 久久av免费 | 精品亚洲午夜久久久久91 | 亚洲国产中文字幕在线 | 久久久精选 | 最新国产视频 | 一级成人网 | 九九九热精品免费视频观看网站 | 久久激情精品 | 精品日韩av|