小編給大家分享一下如何使用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ù)掩碼的終止符 |
圖 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è)面的行為。
圖 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)閉 和