日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
使用AJAX擴(kuò)展器自定義控件

掩碼編輯功能的必要性

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出永定免費(fèi)做網(wǎng)站回饋大家。

在 HTML 中,接受輸入數(shù)據(jù)的唯一方式是使用 標(biāo)記。在 ASP.NET 中,只是使用 TextBox 控件對(duì)輸入標(biāo)記進(jìn)行了封裝。此控件存在的一個(gè)問題是:它并不限制用戶可以在其中鍵入的內(nèi)容。但是,通過使用少量的 JavaScript 代碼,您可以篩選掉不需要的文本。這就是上個(gè)月所介紹的內(nèi)容。這個(gè)月我將添加掩碼編輯功能,該功能允許在鍵入字符時(shí)對(duì)其進(jìn)行篩選,并允許字符以區(qū)域特定格式顯示。掩碼編輯功能可用于篩選、驗(yàn)證、自動(dòng)設(shè)置格式和本地化。還可將該功能應(yīng)用于許多真實(shí)數(shù)據(jù)類型,包括日期、貨幣、時(shí)間、郵政編碼、電話號(hào)碼、社會(huì)保險(xiǎn)號(hào)碼或增值稅 ID 等。在 AJAX 控件工具包中,MaskedEdit 擴(kuò)展器是一個(gè)免費(fèi)組件,將其附加到 TextBox 控件后,您便可以對(duì)許多常見情況下的輸入行為進(jìn)行控制。

MaskedEdit 擴(kuò)展器

在 AJAX 控件工具包中,MaskedEdit 擴(kuò)展器支持 MaskEditType 枚舉類型所指定的某些數(shù)據(jù)格式:2008年度***技術(shù)圖書與原創(chuàng)作者評(píng)選頒獎(jiǎng)典禮

public enum MaskedEditType
{
  None,
  Date,
  Number,
  Time,
  DateTime
}

您可以使用該擴(kuò)展器輸入數(shù)字、日期、時(shí)間和日期/時(shí)間。擴(kuò)展器根據(jù)給定的區(qū)域性設(shè)置來決定輸出格式。以下代碼段顯示了對(duì)接受日期輸入的文本框使用 MaskedEdit 擴(kuò)展器的典型方式:

<asp:TextBox runat="server" ID="TextBox1" />
<act:MaskedEditExtender ID="MaskedEditExtender1" runat="server"
  TargetControlID="TextBox1"        
  Mask="99/99/9999"
  MaskType="Date" />

圖 A 所列。主要通過兩個(gè)屬性來定義輸入掩碼:Mask 和 MaskType。Mask 的默認(rèn)值為 "",用于指定擴(kuò)展器可接受的字符的掩碼。MaskType 的默認(rèn)值為 "",用于使用 MaskedEditType 枚舉所定義的任意值來指示掩碼類型。

FigureAMaskedEdit 擴(kuò)展器屬性

屬性

默認(rèn)值

說明

AcceptAMPM

False

一個(gè)布爾屬性,用于指示是否應(yīng)使用 AM/PM 符號(hào)。

AcceptNegative

None

指示是否允許使用負(fù)號(hào) (-)。來自 MaskedEditShowSymbol 枚舉的可用值包括:None、Left 和 Right。

AutoComplete

True

一個(gè)布爾屬性,用于指示是否必須自動(dòng)填寫用戶未指定的空掩碼字符。

AutoCompleteValue

""

指示在啟用 Autocomplete 時(shí)要使用的默認(rèn)字符。

Century

1900

指示當(dāng)年份的日期掩碼僅有兩位數(shù)字時(shí)要使用的世紀(jì)。

ClearMaskOnLostFocus

True

一個(gè)布爾屬性,用于指示當(dāng)文本框失去輸入焦點(diǎn)時(shí)是否刪除掩碼。

ClearTextOnInvalid

False

一個(gè)布爾屬性,用于指示當(dāng)用戶輸入無效文本時(shí)是否清除文本框。

ClipboardEnabled

True

一個(gè)布爾屬性,用于指示是否允許使用剪貼板進(jìn)行復(fù)制/粘貼。

ClipboardText

Your browser security settings don't permit the automatic execution of paste operations(瀏覽器的安全設(shè)置不允許自動(dòng)執(zhí)行粘貼操作)

指示在執(zhí)行剪貼板粘貼操作時(shí)要使用的提示文本。

CultureName

""

獲取并設(shè)置要使用的區(qū)域性設(shè)置的名稱。

DisplayMoney

None

指示是否顯示貨幣符號(hào)。來自 MaskedEditShowSymbol 枚舉的可用值包括:None、Left 和 Right。

ErrorTooltipCssClass

""

獲取并設(shè)置工具提示消息的 CSS 類。

ErrorTooltipEnabled

False

一個(gè)布爾屬性,用于指示當(dāng)鼠標(biāo)懸停在內(nèi)容無效的文本框上方時(shí),是否顯示工具提示消息。

Filtered

""

獲取并設(shè)置在指定“C”占位符時(shí)掩碼類型的有效字符列表。

InputDirection

LeftToRight

指示文本輸入方向。來自 MaskedEditInputDirection 枚舉的可用值包括:LeftToRight 和 RightToLeft。

Mask

""

指定擴(kuò)展器可接受的字符的掩碼。

MaskType

""

使用 MaskedEditType 枚舉所定義的任意值來指示掩碼類型。

MessageValidatorTip

True

一個(gè)布爾屬性,用于指示當(dāng)用戶在文本框中鍵入內(nèi)容時(shí)是否顯示幫助消息。

OnBlurCssNegative

""

獲取并設(shè)置當(dāng)文本框失去輸入焦點(diǎn)且包含負(fù)值時(shí)所使用的 CSS 類。

OnFocusCssClass

""

獲取并設(shè)置當(dāng)文本框獲取到輸入焦點(diǎn)時(shí)所使用的 CSS 類。

OnFocusCssNegative

""

獲取并設(shè)置當(dāng)文本框獲取到輸入焦點(diǎn)且包含負(fù)值時(shí)所使用的 CSS 類。

OnInvalidCssClass

""

獲取并設(shè)置當(dāng)文本無效時(shí)所使用的 CSS 類。

PromptCharacter

_

獲取并設(shè)置要為未指定的掩碼字符使用的提示字符。

UserDateFormat

None

指示特定的日期格式。可用值由 MaskedEditUserDateFormat 枚舉定義。

UserTimeFormat

None

指示特定的時(shí)間格式。可用值由 MaskedEditUserTimeFormat 枚舉定義。

MaskType 屬性通知擴(kuò)展器目標(biāo)控件將接受某個(gè)特定數(shù)據(jù)類型。Mask 屬性(字符串類型)指示表示文本框的有效輸入的字符序列。例如“12/6/07”和“12-09-2007”都是有效的日期,但它們使用不同的輸入掩碼。

要生成掩碼,需使用預(yù)定義的符號(hào)作為占位符。圖 1 列出了所支持的符號(hào)。例如,“999,999.99”掩碼會(huì)使代碼接受帶有小數(shù)點(diǎn)的數(shù)字,至多有一個(gè)千位分隔符。圖 2 顯示了使用掩碼編輯器擴(kuò)展的文本框所顯示的最終用戶界面。貨幣符號(hào)的外觀由 DisplayMoney 屬性來控制,并會(huì)提示用戶必須鍵入的每個(gè)字符。默認(rèn)提示符為下劃線,不過您可以通過 PromptCharacter 屬性來更改提示符。

Figure1輸入掩碼預(yù)定義的占位符

符號(hào)

說明

9

數(shù)字字符

L

字母

$

字母或空格

C

通過 Filtered 屬性定義的自定義寫字符,區(qū)分大小

A

通過 Filtered 屬性定義的字母或自定義字符

N

通過 Filtered 屬性定義的數(shù)字或自定義字符

?

任意字符

/

日期分隔符,取決于當(dāng)前區(qū)域性設(shè)置

:

時(shí)間分隔符,取決于當(dāng)前區(qū)域性設(shè)置

.

小數(shù)點(diǎn),取決于當(dāng)前區(qū)域性設(shè)置

,

千位分隔符,取決于當(dāng)前區(qū)域性設(shè)置

轉(zhuǎn)義字符

{

重復(fù)掩碼的起始符

}

重復(fù)掩碼的終止符

 
圖 2運(yùn)行中的 MaskedEdit 擴(kuò)展器

對(duì)于日期,還可以使用 AcceptAMPM、Century 等其他屬性,甚至可以使用 MaskedEditUserDateFormat 枚舉中指定的預(yù)定義格式之外的自定義用戶格式,如下所示:

public enum MaskedEditUserDateFormat
{
  None,
  DayMonthYear,
  DayYearMonth,
  MonthDayYear,
  MonthYearDay,
  YearDayMonth,
  YearMonthDay
}

影響 MaskedEdit 擴(kuò)展器所應(yīng)用的格式的許多設(shè)置都繼承自當(dāng)前區(qū)域性設(shè)置。CultureName 屬性指示要應(yīng)用的區(qū)域性設(shè)置。請(qǐng)注意,此設(shè)置將覆蓋通過 @Page 指令中的 UICulture 屬性為頁面定義的區(qū)域性設(shè)置。

#p#

驗(yàn)證掩碼輸入

雖然掩碼擴(kuò)展器提供有動(dòng)態(tài)格式設(shè)置功能,但是還有另外一個(gè)組件(掩碼驗(yàn)證器)可確保將輸入的任何文本都解析為預(yù)期類型:

<act:MaskedEditValidator
   ID="MaskedEditValidator1" runat="server"
   ControlExtender="MaskedEditExtender1"
   ControlToValidate="TextBox2"
   IsValidEmpty="False"
   EmptyValueMessage="Number is required "
   InvalidValueMessage="Number is invalid" />

圖 B 列出了該驗(yàn)證器公開的屬性。掩碼文本框的 Text 屬性返回帶格式的文本。對(duì)于日期,該屬性返回類似于“02/04/2007”的文本;而對(duì)于數(shù)字輸入字段,該屬性返回類似于“1,200.00”的文本。即使在頁面上對(duì)用戶顯示了貨幣符號(hào),Text 屬性中也不包括貨幣符號(hào)。

FigureBMaskedEditValidator 屬性

屬性

說明

AcceptAMPM

指示時(shí)間值是否接受 AM/PM。

ConTRolToValidate

指示要驗(yàn)證的文本框的 ID。

ConTRolExtender

指示附加到文本框的 MaskedEditExtender 控件的 ID。

ClientValidationFunction

獲取并設(shè)置用于自定義驗(yàn)證的客戶端 JavaScript 函數(shù)的名稱。

EmptyValueBlurredText

獲取并設(shè)置當(dāng)文本框沒有輸入焦點(diǎn)且為空時(shí)所顯示的消息。

EmptyValueMessage

獲取并設(shè)置當(dāng)文本框具有輸入焦點(diǎn)但為空時(shí)所顯示的消息。

InitialValue

獲取并設(shè)置文本框的初始值。

InvalidValueMessage

獲取并設(shè)置當(dāng)文本框具有輸入焦點(diǎn)但內(nèi)容無效時(shí)所顯示的消息。

InvalidValueBlurredMessage

獲取并設(shè)置當(dāng)文本框沒有輸入焦點(diǎn)但內(nèi)容無效時(shí)所顯示的消息。

IsValidEmpty

指示文本框是否可以保留為空。

MaximumValue

獲取并設(shè)置輸入的***值。

MaximumValueBlurredMessage

獲取并設(shè)置當(dāng)超出***值且文本框沒有焦點(diǎn)時(shí)所顯示的消息。

MaximumValueMessage

獲取并設(shè)置當(dāng)超出***值且文本框有焦點(diǎn)時(shí)所顯示的消息。

MinimumValue

獲取并設(shè)置輸入的最小值。

MinimumValueBlurredText

獲取并設(shè)置當(dāng)超出最小值且文本框沒有焦點(diǎn)時(shí)所顯示的消息。

MinimumValueMessage

獲取并設(shè)置當(dāng)超出最小值且文本框有焦點(diǎn)時(shí)所顯示的消息。

ValidationExpression

獲取并設(shè)置用于驗(yàn)證輸入的正則表達(dá)式。

TooltipMessage

獲取并設(shè)置當(dāng)文本框具有輸入焦點(diǎn)時(shí)所顯示的消息。

那么,如何將 Text 返回的值解析為邏輯數(shù)據(jù)類型(日期或小數(shù))呢?可以對(duì) DateTime 和 Decimal 類型使用靜態(tài) Parse 方法。但是必須注意所使用的區(qū)域性設(shè)置。例如,“02/04/2007”可以表示 2 月 4 日(美國(guó)區(qū)域性設(shè)置),也可以表示 4 月 2 日(歐洲區(qū)域性設(shè)置)。事實(shí)上,并沒有相關(guān)設(shè)置來保證輸入頁所使用的區(qū)域性設(shè)置與服務(wù)器頁所使用的區(qū)域性設(shè)置相匹配。這就存在以下風(fēng)險(xiǎn):用戶根據(jù)歐洲區(qū)域性設(shè)置來鍵入日期,而將其作為美國(guó)區(qū)域性日期進(jìn)行處理。更糟糕的是,使用意大利小數(shù)和千位分隔符在數(shù)字文本框中輸入的值 1200 可能會(huì)導(dǎo)致引發(fā)異常,因?yàn)?Decimal 類型的解析器默認(rèn)使用美國(guó)區(qū)域性設(shè)置。讓我們來看看如何變通解決這些問題。

要牢記以下事實(shí):除非顯式設(shè)置 CultureName 屬性,否則擴(kuò)展器將默認(rèn)使用 en-US 區(qū)域性設(shè)置。在服務(wù)器上,系統(tǒng)默認(rèn)使用 Page 類上 UICulture 屬性的值。

在您的 Codebehind 類中,首先獲取反映用戶界面所使用的區(qū)域性設(shè)置的 CultureInfo 對(duì)象??梢园凑障旅骘@示的方法繼續(xù)操作:

string culture = "en-us";
if (!String.IsNullOrEmpty(MaskedEditExtender1.CultureName))
  culture = MaskedEditExtender1.CultureName;
CultureInfo info = new CultureInfo(culture);

然后調(diào)用 Parse 方法根據(jù)所選區(qū)域性設(shè)置指定格式提供程序:

NumberFormatInfo numberInfo = info.NumberFormat;
DateTimeFormatInfo dateInfo = info.DateTimeFormat;
DateTime when = DateTime.Parse(TextBox1.Text, dateInfo);
decimal amount = Decimal.Parse(TextBox2.Text, numberInfo);

圖 3 顯示了使用不同的區(qū)域性設(shè)置進(jìn)行輸入時(shí)同一頁面的行為。

 
圖 3使用不同的區(qū)域性設(shè)置將數(shù)據(jù)解析為 .NET 類型

#p#

文本框自動(dòng)完成

您肯定對(duì)自動(dòng)完成功能非常熟悉。該功能會(huì)根據(jù)輸入的前幾個(gè)字符預(yù)測(cè)用戶正在鍵入的單詞。Internet Explorer 會(huì)記錄已在地址欄和表單字段中鍵入的所有字符以自動(dòng)完成填充。

當(dāng)然,此功能完全基于瀏覽器,可以通過將 Autocomplete 屬性設(shè)置為 On 或 Off,來打開或關(guān)閉

標(biāo)記的自動(dòng)完成功能。Autocomplete 屬性不是標(biāo)準(zhǔn)的 HTML 屬性,但是現(xiàn)在幾乎所有瀏覽器都支持該屬性。

AJAX Control Toolbox 中的 AutoComplete 擴(kuò)展器提供與文本框控件相同的行為,但是它要求開發(fā)人員負(fù)責(zé)制訂向用戶提供建議的所有邏輯規(guī)則。該擴(kuò)展器會(huì)創(chuàng)建一個(gè)下拉列表樣式的面板,并將其放置在文本框的右下角。您可以根據(jù)自己的喜好設(shè)置面板的樣式和動(dòng)畫效果。下面的代碼將 Autocomplete 擴(kuò)展器與一個(gè)文本框相關(guān)聯(lián):

<act:AutoCompleteExtender runat="server" ID="AutoComplete1"
  TargetControlID="TextBox1" 
  EnableCaching="true"
  MinimumPrefixLength="1"
  ServicePath="Suggestions.asmx"
  ServiceMethod="GetSuggestions" />

該擴(kuò)展器綁定到用于提供列表填充詞匯的 Web 服務(wù)。MinimumPrefixLength 屬性指示控件何時(shí)調(diào)用該 Web 服務(wù)。已鍵入的文本將用作指定 Web 服務(wù)方法的輸入。響應(yīng)結(jié)果用于填充下拉列表。還可以啟用緩存。這樣,在多次鍵入相同的前綴時(shí)只需調(diào)用一次 Web 服務(wù)就可以了。此外,根據(jù) Web 服務(wù)檢索其數(shù)據(jù)的方式,還可以對(duì)服務(wù)器啟用緩存,減少與數(shù)據(jù)庫或其他遠(yuǎn)程數(shù)據(jù)存儲(chǔ)區(qū)之間的額外往返行程。

圖 C 列出了 AutoComplete 擴(kuò)展器支持的所有屬性。應(yīng)注意,除了此處列出的屬性,其他擴(kuò)展器還具有另外的屬性。TargetControlID 屬性用于獲取和設(shè)置擴(kuò)展控件的 ID;Enabled 屬性允許以編程方式打開和關(guān)閉擴(kuò)展器的功能,該屬性默認(rèn)情況下設(shè)置為 True。還有 BehaviorID 屬性,該屬性用于設(shè)置提供擴(kuò)展行為的客戶端 JavaScript 對(duì)象的名稱。***,還有兩個(gè)重要屬性:ClientState 和 EnableClientState。ClientState 屬性是一個(gè)字符串屬性,用于保持?jǐn)U展器的客戶端狀態(tài)。該狀態(tài)使用隱藏字段保持,字段的名稱可以通過 ClientStateFieldID 屬性進(jìn)行設(shè)置。EnableClientState 屬性是一個(gè)布爾屬性,用于控制是否啟用客戶端狀態(tài)。

FigureCAutoComplete 擴(kuò)展器屬性

屬性

說明

Animations

設(shè)置在顯示或隱藏彈出面板時(shí)要播放的動(dòng)畫。

CompletionInterval

獲取并設(shè)置毫秒數(shù),在該時(shí)間后,擴(kuò)展器將使用綁定的 Web 服務(wù)獲取建議。

CompletionListCssClass

指示用于設(shè)置完成列表彈出面板的樣式的 CSS 類。

CompletionListHighlightedItemCssClass

指示用于設(shè)置完成列表彈出面板中突出顯示項(xiàng)的樣式的 CSS 類。

CompletionListItemCssClass

指示用于設(shè)置完成列表彈出面板中項(xiàng)的樣式的 CSS 類。

CompletionSetCount

獲取并設(shè)置從綁定的 Web 服務(wù)獲取的建議數(shù)。默認(rèn)值為 10。

ContextKey

一個(gè)字符串屬性,用于指示要傳遞給綁定的 Web 服務(wù)的任意頁面或用戶特定信息。

DelimiterCharacters

指示擴(kuò)展器將用于對(duì)文本框的內(nèi)容進(jìn)行標(biāo)記的一個(gè)或多個(gè)字符。Web 服務(wù)隨后將使用***一個(gè)標(biāo)記來提供建議。默認(rèn)情況下不設(shè)置此屬性。

EnableCaching

一個(gè)布爾屬性,用于指示是否啟用客戶端緩存。默認(rèn)情況下為 True。

FirstRowSelected

一個(gè)布爾屬性,用于指示是否自動(dòng)選擇列表中的***個(gè)選項(xiàng)。默認(rèn)情況下為 False。

MinimumPrefixLength

獲取并設(shè)置文本框緩沖區(qū)中可觸發(fā)綁定的 Web 服務(wù)的最少字符數(shù)。默認(rèn)值為 3。

ServiceMethod

獲取并設(shè)置用于調(diào)用綁定的 Web 服務(wù)的方法名稱。

ServicePath

獲取并設(shè)置綁定的 Web 服務(wù)的 URL。

UseContextKey

一個(gè)布爾屬性,用于指示在指定了 ContextKey 屬性的情況下是否應(yīng)使用該屬性的值。默認(rèn)情況下為 False。

#p#

構(gòu)建自動(dòng)完成 Web 服務(wù)

與 AutoComplete 擴(kuò)展器組合使用的 Web 服務(wù)是一項(xiàng) ASP.NET AJAX 腳本服務(wù)。該服務(wù)看起來幾乎與常規(guī)的 ASP.NET Web 服務(wù)沒什么兩樣,只是該服務(wù)的類必須用 ScriptService 屬性加以修飾。如果您使用的 Web 服務(wù)缺少該屬性,則對(duì)相關(guān) ASMX 端點(diǎn)的每個(gè)請(qǐng)求都會(huì)導(dǎo)致 HTTP 500 錯(cuò)誤。不會(huì)向最終用戶顯示異常界面(擴(kuò)展器總是妥善地進(jìn)行降級(jí)處理),而且也不會(huì)顯示帶有建議的彈出面板:

[ScriptService]
public class SuggestionService : WebService
{
  ...
}

請(qǐng)注意,腳本服務(wù)不需要 WebService 屬性,但仍可使用該屬性來提供命名空間信息。

腳本服務(wù)類上使用 WebMethod 屬性標(biāo)記的任何公共方法的名稱都可以成功地分配給擴(kuò)展器上的 ServiceMethod 屬性。用于提供建議的方法必須具有以下簽名:

[WebMethod]
public string[] GetSuggestions(string prefixText, int count)

***個(gè)參數(shù)是用于生成建議的前綴文本。它與文本框的當(dāng)前內(nèi)容相同,其長(zhǎng)度不小于 MinimumPrefixLength 屬性的值。Count 參數(shù)指示要提供的建議數(shù)。Count 參數(shù)的值來自 CompletionSetCount 屬性的值。

如果計(jì)劃利用上下文關(guān)鍵字(一個(gè)字符串屬性,用于指示要傳遞給綁定的 Web 服務(wù)的任何頁面或用戶特定的信息),則應(yīng)為要使用的任何 Web 服務(wù)方法提供重寫方法。下面是簽名:

public string[]GetSuggestions(
  string prefixText, int count, string contextKey)
{
  ...
}

返回值始終以字符串?dāng)?shù)組形式打包。由于使用了 ScriptService 屬性,因此服務(wù)器與客戶端之間的所有通信都將通過 JavaScript Object Notation (JSON) 字符串進(jìn)行。

可以利用 Web 服務(wù)方法上支持的任何屬性來改善服務(wù)性能。例如,WebMethod 屬性上的 CacheDuration 屬性可以強(qiáng)制服務(wù)對(duì)指定期間內(nèi)方法調(diào)用的響應(yīng)進(jìn)行緩存。同樣,如果方法的邏輯確實(shí)需要會(huì)話狀態(tài),則您可以啟用會(huì)話狀態(tài)。

圖 4 顯示了針對(duì)客戶名稱提供建議的示例服務(wù),客戶名稱來自 Northwind 數(shù)據(jù)庫。從性能角度來說,鍵入少量字符就調(diào)用 Web 服務(wù)可能聽起來并不是一個(gè)好主意。但是,有一些因素使得自動(dòng)完成比您想像的要更實(shí)用。AutoComplete 擴(kuò)展器的客戶端緩存基于本地內(nèi)存,永遠(yuǎn)不會(huì)通過隱藏字段保持。通過使用指定前綴作為關(guān)鍵字,可以將與該前綴關(guān)聯(lián)的完成列表存儲(chǔ)到內(nèi)部數(shù)組中。只要在文本框緩沖區(qū)中分解出相同的前綴,都會(huì)檢索該列表。因此,如果用戶重復(fù)鍵入相同的前綴,則不會(huì)通過網(wǎng)絡(luò)對(duì)后端服務(wù)執(zhí)行任何新的請(qǐng)求。

Figure4建議服務(wù)示例

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Data;
using System.Data.SqlClient;
using System.Web.Script.Services;
[WebService(Namespace = "MsdnMag.Articles")]
[ScriptService]
public class SuggestionService : System.Web.Services.WebService
{
  [WebMethod]
  public string[] GetSuggestions(string prefixText, int count)
  {
    DataView data = GetData();
    data = FilterData(data, prefixText);
    int totalCount = data.Count;
    if (data.Count > count)
      totalCount = count;
    string[] suggestions = new string[totalCount];
    int i = 0;
    foreach (DataRowView row in data)
    {
      suggestions[i++] = (string) row["companyname"];
      if (i >= count)
        break;
    }
    return suggestions;
  }
  private DataView GetData()
  {
    DataView view =
      (DataView)HttpContext.Current.Cache["Suggestions"];
    if (view == null)
    {
      SqlDataAdapter adapter = new SqlDataAdapter(
        "SELECT * FROM customers", "...");
      DataTable table = new DataTable();
      adapter.Fill(table);
      view = table.DefaultView;
      HttpContext.Current.Cache["Suggestions"] = view;
    }
    return view;
  }
  private DataView FilterData(DataView view, string prefix)
  {
    view.RowFilter = String.Format("companyname LIKE '{0}%'",
      prefix);
    return view;
  }
}

客戶端緩存明顯比服務(wù)器端緩存更有效,服務(wù)器端緩存可減少一些與數(shù)據(jù)庫之間的往返過程,但無法減少與 Web 服務(wù)器之間的往返行程。在圖 4 顯示的代碼中,服務(wù)加載數(shù)據(jù)庫中的所有客戶并在 ASP.NET 緩存中存儲(chǔ)該列表。然后,從緩存中檢索客戶列表并篩選出與前綴匹配的名稱。

如前所述,用于提供建議的 Web 服務(wù)必須是 ASP.NET AJAX 腳本服務(wù),并通過 JSON 與客戶端進(jìn)行通信。您需要確定 SOAP 客戶端是否也可公開訪問該服務(wù)。ASP.NET AJAX 服務(wù)默認(rèn)情況下具有雙重功能:JSON 和 SOAP。通過將以下代碼添加到主機(jī)應(yīng)用程序的 web.config 文件,可以關(guān)閉 SOAP 客戶端:

<system.web>
?。紈ebServices>
  <protocols>
  ?。糲lear />
  </protocols>
?。?webServices>
</system.web>

使用 ASP.NET 3.5,還可以通過服務(wù) (SVC) 端點(diǎn)將 AutoComplete 擴(kuò)展器綁定到 Windows? Communication Foundation (WCF) 服務(wù)。該擴(kuò)展器使用以下 JavaScript 代碼來代替調(diào)用:

Sys.Net.WebServiceProxy.invoke(
  this.get_servicePath(),
  this.get_serviceMethod(),
  false,
  params,
  Function.createDelegate(this, this._onMethodComplete),
  Function.createDelegate(this, this._onMethodFailed),
  text);

對(duì)于 Microsoft AJAX 客戶端庫中的 WebServiceProxy 類,關(guān)鍵是指定端點(diǎn)在內(nèi)容類型請(qǐng)求標(biāo)題設(shè)置為“application/json; charset=utf-8”時(shí)可以成功處理請(qǐng)求。若要?jiǎng)?chuàng)建 WCF 服務(wù)來提供建議,需要與下面類似的類:

[ServiceContract(Namespace = "MsdnMag.Services")]
[AspNetCompatibilityRequirements(
   RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MySuggestionService
{
  [OperationContract]
  public string[] GetSuggestions(string prefixText, int count)
  {
   ...
  }
}

此外,還需要一個(gè) SVC 端點(diǎn),如下所示:

<%@ ServiceHost Language="C#" 
        Service="MySuggestionService"
        CodeBehind="~/App_Code/WcfSuggestions.cs" %>

若要注冊(cè)服務(wù),可以使用 webHttpBinding 綁定模型向 web.config 文件的 serviceModel 部分添加顯式端點(diǎn)?;蛘撸梢灾付?@ServiceHost 指令的 Factory 屬性,并使該屬性指向以下類:

System.ServiceModel.Activation.WebScriptServiceHostFactory

#p#

設(shè)置 AutoComplete 擴(kuò)展器的樣式

AutoComplete 擴(kuò)展器支持相關(guān)樣式設(shè)置屬性,通過這些屬性,您可以指定要對(duì)控件的樣式部分使用的 CSS 類。特別是,可以設(shè)置整個(gè)彈出區(qū)域的樣式,包括邊框和背景色。還可以對(duì)所有項(xiàng)和所選項(xiàng)使用不同設(shè)置。沒有為可選項(xiàng)提供任何預(yù)定義樣式。默認(rèn)情況下,不會(huì)選擇完成下拉列表中的***個(gè)元素。但是,可以使用 FirstRowSelected 屬性強(qiáng)制自動(dòng)選擇***項(xiàng)。

完成列表將在經(jīng)過指定毫秒數(shù)后顯示。經(jīng)過的時(shí)間通過 CompletionInterval 屬性來控制,默認(rèn)情況下設(shè)置為一秒。經(jīng)過指定的時(shí)間后,擴(kuò)展器將調(diào)用服務(wù)以獲取建議列表。

可以使用 Animations 屬性向列表的打開過程添加動(dòng)作??梢詫?duì)以下兩個(gè)事件定義動(dòng)畫:OnShow 和 OnHide。動(dòng)畫通過 Animation 擴(kuò)展器及其相關(guān)框架來執(zhí)行(參見圖 5 中的示例)。

Figure5使用 Animations 屬性

<Animations>
 ?。糘nShow>
   ?。糞equence>
     ?。糘pacityAction Opacity="0" />
     ?。糎ideAction Visible="true" />
     ?。糚arallel Duration=".4">
       ?。糉adeIn />
     ?。?Parallel>
   ?。?Sequence>
 ?。?OnShow>
 ?。糘nHide>
    <Parallel Duration=".4">
     ?。糉adeOut />
   ?。?Parallel>
  </OnHide>
</Animations>

動(dòng)畫腳本會(huì)向完成列表添加淡入和淡出效果。OpacityAction 節(jié)點(diǎn)用于設(shè)置透明度,HideAction 節(jié)點(diǎn)用于顯示完成列表以及任何其他視覺效果。***,F(xiàn)adeIn 和 FadeOut 動(dòng)作執(zhí)行淡化效果。圖 6 顯示了一個(gè)動(dòng)態(tài)完成列表。

 
圖 6運(yùn)行中的 AutoComplete 擴(kuò)展器

對(duì)列表進(jìn)行漸進(jìn)式搜索

是否曾嘗試在長(zhǎng)長(zhǎng)的列表中查找某個(gè)特定項(xiàng),例如,在包含世界上所有國(guó)家/地區(qū)的列表中查找某個(gè)國(guó)家/地區(qū)的名稱?如果您速度足夠快地鍵入一些連續(xù)字母,可能會(huì)找到所需的國(guó)家/地區(qū),但是即使猶豫了幾毫秒,那么鍵入的下一個(gè)字母就會(huì)成為搜索項(xiàng)的***個(gè)字母。ListSearch 擴(kuò)展器解決了這一限制。請(qǐng)注意,該擴(kuò)展器僅適用于 ASP.NET Web 和 HTML 控件,不可與 SELECT 或 OPTION 等常規(guī) HTML 元素一起使用。

因此,ListSearch 擴(kuò)展器的主要優(yōu)點(diǎn)是:它允許您通過鍵入字母來搜索列表控件中的項(xiàng),并防止搜索字符串在幾秒鐘后丟失;相反,搜索字符串在您按 Esc 或回發(fā)至服務(wù)器(包括全部或部分回發(fā))之前將一直保留在原處。鍵入的任何其他字符都將附加到搜索字符串,用于進(jìn)一步縮小搜索范圍。以下介紹如何使用 ListSearch 擴(kuò)展器:

<act:ListSearchExtender ID="ListSearchExtender1" runat="server"
   TargetControlID="DropDownList1"
   PromptCssClass="Prompt" />

該擴(kuò)展器提供了三個(gè)主要屬性:PromptText、PromptCssClass 和 PromptPosition。所有這些屬性都與提示文本有關(guān),提示文本是顯示在目標(biāo)控件周圍的字符串,用于提供有關(guān)正在搜索的文本的可視化反饋。PromptText 的默認(rèn)值為“Type to search”。當(dāng)目標(biāo)列表控件獲得焦點(diǎn)后,此文本通常顯示在該控件的上方。PromptCssClass 屬性獲取并設(shè)置要應(yīng)用于提示消息的 CSS 類的名稱。提示文本由用戶鍵入的搜索文本來取代。Esc 和 Del 按鈕在此處起著重要作用。Esc 按鈕用于清除當(dāng)前搜索并將列表重置為默認(rèn)所選項(xiàng)。Del 按鈕用于從搜索文本中刪除上一次鍵入的字符,并在列表中更新選擇項(xiàng)。此外,Animations 屬性的作用與上文 AutoComplete 擴(kuò)展器部分中討論的作用相同。

#p#

彈出式上下文菜單

在用戶即將執(zhí)行操作時(shí),為他們提供可以執(zhí)行哪些操作的選項(xiàng),這一點(diǎn)非常好。幾年前,工具提示就是一項(xiàng)巨大的改進(jìn),因?yàn)樗鼈兲峁┝擞嘘P(guān)特定控件角色的彈出式附加信息。動(dòng)態(tài) HTML 的出現(xiàn)使得 HTML 工具提示成為可能。

如今,HoverMenu 擴(kuò)展器能夠在任意 ASP.NET 服務(wù)器控件旁邊顯示彈出面板。此擴(kuò)展器最常用的一個(gè)用法是,顯示由鼠標(biāo)移動(dòng)事件而不是右鍵單擊激活的上下文菜單。

當(dāng)用戶將鼠標(biāo)移動(dòng)到控件上方時(shí),HoverMenu 擴(kuò)展器就會(huì)激活。因此,將在控件附近顯示指定的彈出面板;實(shí)際位置可以通過編程方式進(jìn)行控制。此外,可以對(duì)控件應(yīng)用 CSS 樣式以醒目的格式標(biāo)記該控件。

圖 7 顯示的單選按鈕菜單可提供有關(guān)要在文本框中插入的文本的建議。下面是相關(guān)擴(kuò)展器的聲明:

 
圖 7運(yùn)行中的 HoverMenu 擴(kuò)展器

<act:HoverMenuExtender ID="HoverMenu1" runat="server"
  TargetControlID="TextBox1"
  PopupControlID="Panel1" />

Panel1 控件包含單選按鈕列表。為了確保所有選擇都在文本框目標(biāo)控件中進(jìn)行處理,您在單選按鈕列表中定義了一個(gè) SelectedIndexChanged 事件,并將所有相關(guān)操作都封裝在 UpdatePanel 控件中。(有關(guān)詳細(xì)信息,請(qǐng)參閱本專欄的下載內(nèi)容中所附的源代碼)。

除了 PopupControlID 和 TargetControlID 屬性之外,HoverMenu 擴(kuò)展器還提供了一些其他屬性。HoverCssClass 屬性指示要在懸停菜單可見時(shí)應(yīng)用于目標(biāo)控件的 CSS 類。PopupPosition 屬性指示相對(duì)于目標(biāo)控件的彈出位置,可能的值包括 Top、Right、Left 和 Bottom。OffsetX 和 OffsetY 屬性用于設(shè)置相對(duì)于確定位置的水平和垂直偏移量。***,PopDelay 屬性指示 DOM 事件與顯示彈出菜單之間的延遲。默認(rèn)值為 100 毫秒。

將鼠標(biāo)懸停在 DOM 事件上方時(shí),該事件會(huì)觸發(fā) HoverMenu 擴(kuò)展器。HoverMenu 擴(kuò)展器與 Popup 擴(kuò)展器之間并沒有太大差異。主要區(qū)別在于激活機(jī)制和觸發(fā)器。當(dāng)用戶將焦點(diǎn)指向特定的目標(biāo)控件時(shí),將會(huì)激活 Popup 擴(kuò)展器。若要激活 HoverMenu 擴(kuò)展器,用戶只需將鼠標(biāo)移動(dòng)到相應(yīng)控件上方即可。

結(jié)束語

如果希望網(wǎng)站內(nèi)容更為豐富并具有更強(qiáng)的交互性,則就需要使用更多的 JavaScript。雖然手工編寫 JavaScript 在實(shí)現(xiàn)簡(jiǎn)單功能方面尚能夠勝任,但是,如果要實(shí)現(xiàn)更高層次的交互性,僅靠手工編寫代碼是遠(yuǎn)遠(yuǎn)不夠的。


當(dāng)前題目:使用AJAX擴(kuò)展器自定義控件
文章出自:http://www.5511xx.com/article/cojegoc.html