TextBoxWatermarkExtender擴展器與RequiredFieldValidator控件相沖突的解決方案
編輯:AJAX詳解  
在使用AJax CONTROL TOOLKIT擴展器TextBoxWatermarkExtender擴展器時,我們常常需要聯合使用ASP.Net校驗器控件RequiredFIEldValidator。但這樣以來,當用戶沒有在文本框中輸入文字時,TextBoxWatermarkExtender擴展器的WatermarkText屬性將在文本框中加入水印效果文字。
於是出現一個問題:無論用戶是否在文本框中輸入了內容,文本框的內容終不會為空。也就是說,此文本框將始終能夠通過校驗器控件RequiredFIEldValidator的驗證。
如之奈何?
解決辦法
針對上面的矛盾問題,我下面給出幾種典型的克服辦法。
方法一:借助於CustomValidator控件
借助於CustomValidator的客戶端腳本函數可以從客戶端對文本框內容進行校驗。
示例如下:
用戶名:<ASP:textbox id="UserName" runat="server"></ASP:textbox>
<ASP:RequiredFIEldValidator id="rfN" runat="server" ErrorMessage="姓名不能為空!"
ControlToValidate="UserName"></ASP:RequiredFIEldValidator>
<AJaxToolkit:TextBoxWatermarkExtender ID="TextBoxWatermarkExtender1" runat="server" TargetControlID="UserName" WatermarkText="請在此輸入姓名">
</AJaxToolkit:TextBoxWatermarkExtender>
<ASP:CustomValidator ID="CustomValidator1" runat="server" ClIEntValidationFunction="validateUserName" ErrorMessage="請在此輸入姓名"
ControlToValidate="UserName" Display="Dynamic">*</ASP:CustomValidator>
再來看ClIEntValidationFunction屬性對應內容,如下所示:
<script. type="text/Javascript">
function validateUserName(sender, args) {
if (args.Value == "請在此輸入姓名") {
args.IsValid = false;
}
}
............
評價:此方案把校驗交給了客戶端JS腳本。上面的函數validateUserName
實現了把文本框內容與水印文字對照。如果是原來的水印文字則認為文本框仍然沒有輸入內容,從而保持了校驗器控件RequiredFIEldValidator的原有的驗證效果。
方法二:借助於雙重RequiredFIEldValidator控件
不種方法不需借助於客戶端腳本函數便可以保留校驗器控件RequiredFIEldValidator對文本框內容的校驗功能。請看下面的示例代碼:
<asp:TextBox ID="tbUsername" runat="server" Width="60%" MaxLength="50"></ASP:TextBox>
<asp:RequiredFIEldValidator ID="rfNameBlank" runat="server" ControlToValidate="tbUsername" Display="none" ErrorMessage="用戶名稱不能為空!"></ASP:RequiredFIEldValidator>
<asp:RequiredFIEldValidator ID="rfNameValue" runat="server" ControlToValidate="tbUsername" Display="none" InitialValue="請輸入用戶名稱" ErrorMessage="用戶名稱不能為空!"></ASP:RequiredFIEldValidator>
<asp:RegularExpressionValidator ID="revName" runat="server" ControlToValidate="tbUsername" Display="none" ErrorMessage="用戶名稱的長度最大為50,請重新輸入。" ValidationExpression=".{1,50}"></ASP:RegularExpressionValidator>
<AJaxToolkit:TextBoxWatermarkExtender ID="wmeName" runat="server" TargetControlID="tbUsername" WatermarkText="請輸入用戶名稱" WatermarkCSSClass="Watermark"></AJaxToolkit:TextBoxWatermarkExtender>
<AJaxToolkit:ValidatorCalloutExtender ID="vceNameBlank" runat="server" TargetControlID="rfNameBlank" HighlightCSSClass="Validator"></AJaxToolkit:ValidatorCalloutExtender>
<AJaxToolkit:ValidatorCalloutExtender ID="vceNameValue" runat="server" TargetControlID="rfNameValue" HighlightCSSClass="Validator"></AJaxToolkit:ValidatorCalloutExtender>
<AJaxToolkit:ValidatorCalloutExtender ID="vceNameRegex" runat="server" TargetControlID="revName" HighlightCSSClass="Validator"></AJaxToolkit:ValidatorCalloutExtender>
當然,上面代碼中,你可以省略使用另一種擴展器控件ValidatorCalloutExtender。
另外兩種可能的解決方案
除了上述二法,還有另外兩種可能的解決方案如下:
第一種是借助於Page.Validate()方法對輸入進行驗證。這種方法實現起來比較簡單,但卻喪失了校驗器控件RequiredFIEldValidator原有的客戶端校驗功能,而且引發一次不必要的頁面回送。
第二種方法是使用RegularExpressionValidator取代RequiredFIEldValidator,即使用正則表達式來進行驗證,只是嫌寫起來比較麻煩,但保留了校驗器控件RequiredFIEldValidator原有的客戶端校驗功能,亦不失為一種辦法。