真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用AJAX擴(kuò)展器自定義控件

小編給大家分享一下如何使用AJAX擴(kuò)展器自定義控件,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬主機(jī)、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、天全網(wǎng)站維護(hù)、網(wǎng)站推廣。

掩碼編輯功能的必要性

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

MaskedEdit 擴(kuò)展器

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

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

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

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

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

FigureAMaskedEdit 擴(kuò)展器屬性

屬性

默認(rèn)值

說(shuō)明

AcceptAMPM

False

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

AcceptNegative

None

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

AutoComplete

True

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

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)用戶(hù)輸入無(wú)效文本時(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è)置的名稱(chēng)。

DisplayMoney

None

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

ErrorTooltipCssClass

""

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

ErrorTooltipEnabled

False

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

Filtered

""

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

InputDirection

LeftToRight

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

Mask

""

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

MaskType

""

使用 MaskedEditType枚舉所定義的任意值來(lái)指示掩碼類(lèi)型。

MessageValidatorTip

True

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

OnBlurCssNegative

""

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

OnFocusCssClass

""

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

OnFocusCssNegative

""

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

OnInvalidCssClass

""

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

PromptCharacter

_

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

UserDateFormat

None

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

UserTimeFormat

None

指示特定的時(shí)間格式??捎弥涤?MaskedEditUserTimeFormat枚舉定義。

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

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

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

符號(hào)

說(shuō)明

9

數(shù)字字符

L

字母

$

字母或空格

C

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

A

通過(guò) Filtered屬性定義的字母或自定義字符

N

通過(guò) 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ù)掩碼的終止符

如何使用AJAX擴(kuò)展器自定義控件 
圖 2運(yùn)行中的 MaskedEdit 擴(kuò)展器

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

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è)置將覆蓋通過(guò) @Page 指令中的 UICulture 屬性為頁(yè)面定義的區(qū)域性設(shè)置。

驗(yàn)證掩碼輸入

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

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

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

FigureBMaskedEditValidator 屬性

屬性

說(shuō)明

AcceptAMPM

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

ConTRolToValidate

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

ConTRolExtender

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

ClientValidationFunction

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

EmptyValueBlurredText

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

EmptyValueMessage

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

InitialValue

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

InvalidValueMessage

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

InvalidValueBlurredMessage

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

IsValidEmpty

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

MaximumValue

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

MaximumValueBlurredMessage

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

MaximumValueMessage

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

MinimumValue

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

MinimumValueBlurredText

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

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

在您的 Codebehind 類(lèi)中,首先獲取反映用戶(hù)界面所使用的區(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í)同一頁(yè)面的行為。

如何使用AJAX擴(kuò)展器自定義控件 
圖 3使用不同的區(qū)域性設(shè)置將數(shù)據(jù)解析為 .NET 類(lèi)型

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

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

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

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

AJAX Control Toolbox 中的 AutoComplete 擴(kuò)展器提供與文本框控件相同的行為,但是它要求開(kāi)發(fā)人員負(fù)責(zé)制訂向用戶(hù)提供建議的所有邏輯規(guī)則。該擴(kuò)展器會(huì)創(chuàng)建一個(gè)下拉列表樣式的面板,并將其放置在文本框的右下角。您可以根據(jù)自己的喜好設(shè)置面板的樣式和動(dòng)畫(huà)效果。下面的代碼將 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ù)庫(kù)或其他遠(yuǎn)程數(shù)據(jù)存儲(chǔ)區(qū)之間的額外往返行程。

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

FigureCAutoComplete 擴(kuò)展器屬性

屬性

說(shuō)明

Animations

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

CompletionInterval

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

CompletionListCssClass

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

CompletionListHighlightedItemCssClass

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

CompletionListItemCssClass

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

CompletionSetCount

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

ContextKey

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

DelimiterCharacters

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

EnableCaching

一個(gè)布爾屬性,用于指示是否啟用客戶(hù)端緩存。默認(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ù)的方法名稱(chēng)。

ServicePath

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

UseContextKey

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

使用 ASP.NET 3.5,還可以通過(guò)服務(wù) (SVC) 端點(diǎn)將 AutoComplete 擴(kuò)展器綁定到 Windows® Communication Foundation (WCF) 服務(wù)。該擴(kuò)展器使用以下 JavaScript 代碼來(lái)代替調(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 客戶(hù)端庫(kù)中的 WebServiceProxy 類(lèi),關(guān)鍵是指定端點(diǎn)在內(nèi)容類(lèi)型請(qǐng)求標(biāo)題設(shè)置為“application/json; charset=utf-8”時(shí)可以成功處理請(qǐng)求。若要?jiǎng)?chuàng)建 WCF 服務(wù)來(lái)提供建議,需要與下面類(lèi)似的類(lèi):

[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 屬性,并使該屬性指向以下類(lèi):

System.ServiceModel.Activation.WebScriptServiceHostFactory

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

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

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

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

Figure5使用 Animations 屬性

<Animations>
<OnShow>
<Sequence>
<OpacityAction Opacity="0" />
<HideAction Visible="true" />
<Parallel Duration=".4">
<FadeIn />
</Parallel>
</Sequence>
</OnShow>
<OnHide>
<Parallel Duration=".4">
<FadeOut />
</Parallel>
</OnHide>
</Animations>

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

如何使用AJAX擴(kuò)展器自定義控件 
圖 6運(yùn)行中的 AutoComplete 擴(kuò)展器

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

是否曾嘗試在長(zhǎng)長(zhǎng)的列表中查找某個(gè)特定項(xiàng),例如,在包含世界上所有國(guó)家/地區(qū)的列表中查找某個(gè)國(guó)家/地區(qū)的名稱(chēng)?如果您速度足夠快地鍵入一些連續(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)是:它允許您通過(guò)鍵入字母來(lái)搜索列表控件中的項(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)控件周?chē)淖址?,用于提供有關(guān)正在搜索的文本的可視化反饋。PromptText 的默認(rèn)值為“Type to search”。當(dāng)目標(biāo)列表控件獲得焦點(diǎn)后,此文本通常顯示在該控件的上方。PromptCssClass 屬性獲取并設(shè)置要應(yīng)用于提示消息的 CSS 類(lèi)的名稱(chēng)。提示文本由用戶(hù)鍵入的搜索文本來(lái)取代。Esc 和 Del 按鈕在此處起著重要作用。Esc 按鈕用于清除當(dāng)前搜索并將列表重置為默認(rèn)所選項(xiàng)。Del 按鈕用于從搜索文本中刪除上一次鍵入的字符,并在列表中更新選擇項(xiàng)。此外,Animations 屬性的作用與上文 AutoComplete 擴(kuò)展器部分中討論的作用相同。

彈出式上下文菜單

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

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

如何使用AJAX擴(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)參閱本專(zhuān)欄的下載內(nèi)容中所附的源代碼)。

除了 PopupControlID 和 TargetControlID 屬性之外,HoverMenu 擴(kuò)展器還提供了一些其他屬性。HoverCssClass 屬性指示要在懸停菜單可見(jiàn)時(shí)應(yīng)用于目標(biāo)控件的 CSS 類(lèi)。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ò)展器之間并沒(méi)有太大差異。主要區(qū)別在于激活機(jī)制和觸發(fā)器。當(dāng)用戶(hù)將焦點(diǎn)指向特定的目標(biāo)控件時(shí),將會(huì)激活 Popup 擴(kuò)展器。若要激活 HoverMenu 擴(kuò)展器,用戶(hù)只需將鼠標(biāo)移動(dòng)到相應(yīng)控件上方即可。

看完了這篇文章,相信你對(duì)“如何使用AJAX擴(kuò)展器自定義控件”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


分享題目:如何使用AJAX擴(kuò)展器自定義控件
本文鏈接:http://weahome.cn/article/ipgssg.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部