新聞中心
掩碼編輯功能的必要性

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(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" /> |
圖 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 |
圖 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 日(美國區(qū)域性設(shè)置),也可以表示 4 月 2 日(歐洲區(qū)域性設(shè)置)。事實(shí)上,并沒有相關(guān)設(shè)置來保證輸入頁所使用的區(qū)域性設(shè)置與服務(wù)器頁所使用的區(qū)域性設(shè)置相匹配。這就存在以下風(fēng)險(xiǎn):用戶根據(jù)歐洲區(qū)域性設(shè)置來鍵入日期,而將其作為美國區(qū)域性日期進(jìn)行處理。更糟糕的是,使用意大利小數(shù)和千位分隔符在數(shù)字文本框中輸入的值 1200 可能會(huì)導(dǎo)致引發(fā)異常,因?yàn)?Decimal 類型的解析器默認(rèn)使用美國區(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"; |
然后調(diào)用 Parse 方法根據(jù)所選區(qū)域性設(shè)置指定格式提供程序:
NumberFormatInfo numberInfo = info.NumberFormat; |
圖 3 顯示了使用不同的區(qū)域性設(shè)置進(jìn)行輸入時(shí)同一頁面的行為。
圖 3使用不同的區(qū)域性設(shè)置將數(shù)據(jù)解析為 .NET 類型
#p#
文本框自動(dòng)完成
您肯定對(duì)自動(dòng)完成功能非常熟悉。該功能會(huì)根據(jù)輸入的前幾個(gè)字符預(yù)測用戶正在鍵入的單詞。Internet Explorer 會(huì)記錄已在地址欄和表單字段中鍵入的所有字符以自動(dòng)完成填充。
當(dāng)然,此功能完全基于瀏覽器,可以通過將 Autocomplete 屬性設(shè)置為 On 或 Off,來打開或關(guā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" |
該擴(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] |
請(qǐng)注意,腳本服務(wù)不需要 WebService 屬性,但仍可使用該屬性來提供命名空間信息。
腳本服務(wù)類上使用 WebMethod 屬性標(biāo)記的任何公共方法的名稱都可以成功地分配給擴(kuò)展器上的 ServiceMethod 屬性。用于提供建議的方法必須具有以下簽名:
[WebMethod] |
***個(gè)參數(shù)是用于生成建議的前綴文本。它與文本框的當(dāng)前內(nèi)容相同,其長度不小于 MinimumPrefixLength 屬性的值。Count 參數(shù)指示要提供的建議數(shù)。Count 參數(shù)的值來自 CompletionSetCount 屬性的值。
如果計(jì)劃利用上下文關(guān)鍵字(一個(gè)字符串屬性,用于指示要傳遞給綁定的 Web 服務(wù)的任何頁面或用戶特定的信息),則應(yīng)為要使用的任何 Web 服務(wù)方法提供重寫方法。下面是簽名:
public string[]GetSuggestions( |
返回值始終以字符串?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> |
使用 ASP.NET 3.5,還可以通過服務(wù) (SVC) 端點(diǎn)將 AutoComplete 擴(kuò)展器綁定到 Windows? Communication Foundation (WCF) 服務(wù)。該擴(kuò)展器使用以下 JavaScript 代碼來代替調(diào)用:
Sys.Net.WebServiceProxy.invoke( |
對(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")] |
此外,還需要一個(gè) SVC 端點(diǎn),如下所示:
<%@ ServiceHost Language="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> |
動(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)式搜索
是否曾嘗試在長長的列表中查找某個(gè)特定項(xiàng),例如,在包含世界上所有國家/地區(qū)的列表中查找某個(gè)國家/地區(qū)的名稱?如果您速度足夠快地鍵入一些連續(xù)字母,可能會(huì)找到所需的國家/地區(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" |
該擴(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" |
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)簡單功能方面尚能夠勝任,但是,如果要實(shí)現(xiàn)更高層次的交互性,僅靠手工編寫代碼是遠(yuǎn)遠(yuǎn)不夠的。
文章名稱:使用AJAX擴(kuò)展器自定義控件
轉(zhuǎn)載源于:http://m.5511xx.com/article/cojegoc.html


咨詢
建站咨詢
