自制的一个输入验证控件

今天用正则表达式时突然来了兴致,想自己做一个验证用户输入的用户控件,经过几个小时的努力,终于完成了,内置了包括整数,正整数,负整数,数字,电话或手机,正数,负数,浮点数, 正浮点数,负浮点数,浮点数2,非负浮点数, 非正浮点数, 邮件,颜色,url,中文, ACSII字符,邮编,手机,IP地址,非空,图片,压缩文件, 日期, QQ号码,国内电话, 用户名,字母,大写字母,小写字母,身份证的32种常见的用户输入验证。先把代码贴出来再详细说说:
RegularExpressionInput.ascx代码:
  1. <%@ControlLanguage="C#"AutoEventWireup="true"CodeBehind="RegularExpressionInput.ascx.cs"Inherits="WebApplication1.RegularExpressionInput"%>
  2. <asp:TextBoxID="TextBox1"runat="server"></asp:TextBox><spanid="<%=this.ClientID%>_error"style="color:<%=color%>"></span>

RegularExpressionInput.cs代码:

  1. usingSystem;
  2. usingSystem.Collections;
  3. usingSystem.Configuration;
  4. usingSystem.Data;
  5. usingSystem.Linq;
  6. usingSystem.Web;
  7. usingSystem.Web.Security;
  8. usingSystem.Web.UI;
  9. usingSystem.Web.UI.HtmlControls;
  10. usingSystem.Web.UI.WebControls;
  11. usingSystem.Web.UI.WebControls.WebParts;
  12. usingSystem.Reflection;
  13. namespaceWebApplication1
  14. {
  15. publicpartialclassRegularExpressionInput:System.Web.UI.UserControl
  16. {
  17. ///<summary>
  18. ///验证类型枚举
  19. ///</summary>
  20. publicenumvalidation
  21. {
  22. 整数,
  23. 正整数,
  24. 负整数,
  25. 数字,
  26. 电话或手机,
  27. 正数,
  28. 负数,
  29. 浮点数,
  30. 正浮点数,
  31. 负浮点数,
  32. 浮点数2,
  33. 非负浮点数,
  34. 非正浮点数,
  35. 邮件,
  36. 颜色,
  37. url,
  38. 中文,
  39. ACSII字符,
  40. 邮编,
  41. 手机,
  42. IP地址,
  43. 非空,
  44. 图片,
  45. 压缩文件,
  46. 日期,
  47. QQ号码,
  48. 国内电话,
  49. 用户名,
  50. 字母,
  51. 大写字母,
  52. 小写字母,
  53. 身份证
  54. }
  55. privatevalidationval;
  56. ///<summary>
  57. ///验证类型
  58. ///</summary>
  59. publicvalidationValidation
  60. {
  61. get{returnval;}
  62. set{val=value;}
  63. }
  64. privatestringerrorMsg;
  65. ///<summary>
  66. ///出错提示
  67. ///</summary>
  68. publicstringErrorMsg
  69. {
  70. get{returnerrorMsg;}
  71. set{errorMsg=value;}
  72. }
  73. ///<summary>
  74. ///输入文本
  75. ///</summary>
  76. publicstringText
  77. {
  78. get{returnthis.TextBox1.Text;}
  79. set{this.TextBox1.Text=value;}
  80. }
  81. privateSystem.Drawing.ColormsgColor;
  82. ///<summary>
  83. ///错误提示颜色
  84. ///</summary>
  85. publicSystem.Drawing.ColorMsgColor
  86. {
  87. get{returnmsgColor;}
  88. set{msgColor=value;}
  89. }
  90. protectedstringcolor;
  91. protectedstringpattern;
  92. protectedvoidPage_Load(objectsender,EventArgse)
  93. {
  94. switch(Convert.ToInt32(val))
  95. {
  96. case0://整数
  97. pattern="/^-?[1-9]\\d*$/";
  98. break;
  99. case1://正整数
  100. pattern="/^[1-9]\\d*$/";
  101. break;
  102. case2://负整数
  103. pattern="/^-[1-9]\\d*$/";
  104. break;
  105. case3://数字
  106. pattern="/^([+-]?)\\d*\\.?\\d+$/";
  107. break;
  108. case4://电话或手机
  109. pattern="/d*\\-?\\d+$/";
  110. break;
  111. case5://正数(正整数+0)
  112. pattern="/^[1-9]\\d*|0$/";
  113. break;
  114. case6://负数(负整数+0)
  115. pattern="/^-[1-9]\\d*|0$/";
  116. break;
  117. case7://浮点数
  118. pattern="/^([+-]?)\\d*\\.\\d+$/";
  119. break;
  120. case8://正浮点数
  121. pattern="/^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*$/";
  122. break;
  123. case9://负浮点数
  124. pattern="/^-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)$/";
  125. break;
  126. case10://浮点数
  127. pattern="/^-?([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0)$/";
  128. break;
  129. case11://非负浮点数(正浮点数+0)
  130. pattern="/^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0$/";
  131. break;
  132. case12://非正浮点数(负浮点数+0)
  133. pattern="/^(-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*))|0?.0+|0$/";
  134. break;
  135. case13://邮件
  136. pattern="/^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$/";
  137. break;
  138. case14://颜色
  139. pattern="/^[a-fA-F0-9]{6}$/";
  140. break;
  141. case15://url(http格式的)
  142. pattern="/^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-.\\/?%&=]*)?$/";
  143. break;
  144. case16://仅中文
  145. pattern="/^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$/";
  146. break;
  147. case17://仅ACSII字符
  148. pattern="/^[\\x00-\\xFF]+$/";
  149. break;
  150. case18://邮编
  151. pattern="/^\\d{6}$/";
  152. break;
  153. case19://手机(13号段和15号段)
  154. pattern="/^(13|15)[0-9]{9}$/";
  155. break;
  156. case20://ip地址
  157. pattern="/^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5]).(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5]).(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5]).(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$/";
  158. break;
  159. case21://非空
  160. pattern="/^\\S+$/";
  161. break;
  162. case22://图片
  163. pattern="/(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$/";
  164. break;
  165. case23://压缩文件
  166. pattern="/(.*)\\.(rar|zip|7zip|tgz)$/";
  167. break;
  168. case24://日期
  169. pattern="/^\\d{4}(\\-|\\/|\\.)\\d{1,2}\\1\\d{1,2}$/";
  170. break;
  171. case25://QQ号码
  172. pattern="/^[1-9]*[1-9][0-9]*$/";
  173. break;
  174. case26://国内电话
  175. pattern="/(\\d{3}-|\\d{4}-)?(\\d{8}|\\d{7})/";
  176. break;
  177. case27://用来用户注册。匹配由数字、26个英文字母或者下划线组成的字符串
  178. pattern="/^(?!\\d)[a-zA-Z0-9\\u4e00-\\u9fa5]+$/";
  179. break;
  180. case28://字母
  181. pattern="/^[A-Za-z]+$/";
  182. break;
  183. case29://大写字母
  184. pattern="/^[A-Z]+$/";
  185. break;
  186. case30://小写字母
  187. pattern="/^[a-z]+$/";
  188. break;
  189. case31://身份证
  190. pattern="/^[1-9]([0-9]{14}|[0-9]{17})$/";
  191. break;
  192. default:
  193. pattern=string.Empty;
  194. break;
  195. }
  196. color = msgColor.IsEmpty ? System.Drawing.Color.Red.Name : "#" + msgColor.Name.Substring(2);
  197. TextBox1.Attributes["onkeyup"]+="if(this.value.match("+pattern+")){varerr=document.getElementById('"+
  198. this.ClientID+"_error');err.innerHTML='';returntrue;}else{varerr=document.getElementById('"+this.ClientID+"_error');err.innerHTML=\""+
  199. (string.IsNullOrEmpty(errorMsg)?"*":errorMsg)+"\";returnfalse;}";
  200. AddAttributes(Page);
  201. }
  202. ///<summary>
  203. ///为所有具有CausesValidation属性的控件添加检查脚本
  204. ///</summary>
  205. ///<paramname="ctrl"></param>
  206. privatevoidAddAttributes(Controlctrl)
  207. {
  208. if(ctrl.HasControls())
  209. {
  210. foreach(Controlcinctrl.Controls)
  211. {
  212. Typet=c.GetType();
  213. PropertyInfocauseVal=t.GetProperty("CausesValidation",typeof(bool));
  214. if(causeVal!=null)
  215. {
  216. PropertyInfoattr=t.GetProperty("Attributes",typeof(AttributeCollection));
  217. AttributeCollectionattributes=(AttributeCollection)attr.GetValue(c,null);
  218. attributes["onclick"]+="vartxt=document.getElementById('"+this.TextBox1.ClientID+"');if(txt.value.match("+pattern+")){varerr=document.getElementById('"+
  219. this.ClientID+"_error');err.innerHTML='';returntrue;}else{varerr=document.getElementById('"+this.ClientID+"_error');err.innerHTML=\""+
  220. (string.IsNullOrEmpty(errorMsg)?"*":errorMsg)+"\";returnfalse;}";
  221. }
  222. AddAttributes(c);
  223. }
  224. }
  225. }
  226. }
  227. }

测试网页前台代码:

  1. <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="Default2.aspx.cs"Inherits="WebApplication1.gy.Default2"%>
  2. <%@RegisterSrc="~/RegularExpressionInput.ascx"TagName="RegularExpressionInput"
  3. TagPrefix="rei"%>
  4. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <htmlxmlns="http://www.w3.org/1999/xhtml">
  6. <headrunat="server">
  7. <title>无标题页</title>
  8. </head>
  9. <body>
  10. <formid="form1"runat="server">
  11. <div>
  12. <asp:ButtonID="Button1"runat="server"Text="Button"OnClick="Button1_Click"/>
  13. <asp:LinkButtonID="LinkButton1"runat="server"OnClick="LinkButton1_Click">LinkButton</asp:LinkButton>
  14. <rei:RegularExpressionInputID="RegularExpressionInput1"runat="server"ErrorMsg="请输入数字"
  15. MsgColor="#FF99FF"Validation="数字"/>
  16. <rei:RegularExpressionInputID="RegularExpressionInput2"runat="server"ErrorMsg="请输入中文"
  17. MsgColor="#333399"Validation="中文"/>
  18. </div>
  19. </form>
  20. </body>
  21. </html>

后台代码:
  1. usingSystem;
  2. usingSystem.Collections;
  3. usingSystem.Configuration;
  4. usingSystem.Data;
  5. usingSystem.Linq;
  6. usingSystem.Web;
  7. usingSystem.Web.Security;
  8. usingSystem.Web.UI;
  9. usingSystem.Web.UI.HtmlControls;
  10. usingSystem.Web.UI.WebControls;
  11. usingSystem.Web.UI.WebControls.WebParts;
  12. usingSystem.Xml.Linq;
  13. namespaceWebApplication1
  14. {
  15. publicpartialclassDefault2:System.Web.UI.Page
  16. {
  17. protectedvoidPage_Load(objectsender,EventArgse)
  18. {
  19. }
  20. protectedvoidButton1_Click(objectsender,EventArgse)
  21. {
  22. Response.Redirect("~/Default.aspx");
  23. }
  24. protectedvoidLinkButton1_Click(objectsender,EventArgse)
  25. {
  26. Response.Write("Hello");
  27. }
  28. }
  29. }
做这个控件,验证部分不难,无非就是正则表达式而已,难的是这个控件要另页面上所有回发控件在回发之前先进行验证判断,如果验证不通过则不能回发。这里我采取的是遍历页面所有控件,如果控件具有CausesValidation属性,则在回发之前先进行输入验证,通过返回值决定是否回发。另外还有一个难点就是如果存在多个验证控件的时候如何控制页面上的回发控件都能都每一个验证控件进行验证,我现在的做法是将页面所有回发控件的onclick都加上了验证js,这样一来使得源代码大大增加,这是这个控件的一个缺陷,还有待修正。此控件可以在属性窗口处设置出错提示,提示颜色及验证类型,使用起来还是挺方便的,希望大家多提宝贵意见

你可能感兴趣的:(Web,UI,正则表达式,asp,LINQ)