自制的一个输入验证控件

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

RegularExpressionInput.cs代码:

  1. using System;
  2. using System.Collections;
  3. using System.Configuration;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Web;
  7. using System.Web.Security;
  8. using System.Web.UI;
  9. using System.Web.UI.HtmlControls;
  10. using System.Web.UI.WebControls;
  11. using System.Web.UI.WebControls.WebParts;
  12. using System.Reflection;
  13. namespace WebApplication1
  14. {
  15.     public partial class RegularExpressionInput : System.Web.UI.UserControl
  16.     {
  17.         /// <summary>
  18.         /// 验证类型枚举
  19.         /// </summary>
  20.         public enum validation
  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.         private validation val;
  56.         /// <summary>
  57.         /// 验证类型
  58.         /// </summary>
  59.         public validation Validation
  60.         {
  61.             get { return val; }
  62.             set { val = value; }
  63.         }
  64.         private string errorMsg;
  65.         /// <summary>
  66.         /// 出错提示
  67.         /// </summary>
  68.         public string ErrorMsg
  69.         {
  70.             get { return errorMsg; }
  71.             set { errorMsg = value; }
  72.         }
  73.         /// <summary>
  74.         /// 输入文本
  75.         /// </summary>
  76.         public string Text
  77.         {
  78.             get { return this.TextBox1.Text; }
  79.             set { this.TextBox1.Text = value; }
  80.         }
  81.         private System.Drawing.Color msgColor;
  82.         /// <summary>
  83.         /// 错误提示颜色
  84.         /// </summary>
  85.         public System.Drawing.Color MsgColor
  86.         {
  87.             get { return msgColor; }
  88.             set { msgColor = value; }
  89.         }
  90.         protected string color;
  91.         protected string pattern;
  92.         protected void Page_Load(object sender, EventArgs e)
  93.         {
  94.             switch (Convert.ToInt32(val))
  95.             {
  96.                 case 0://整数
  97.                     pattern = "/^-?[1-9]//d*$/";
  98.                     break;
  99.                 case 1://正整数
  100.                     pattern = "/^[1-9]//d*$/";
  101.                     break;
  102.                 case 2://负整数
  103.                     pattern = "/^-[1-9]//d*$/";
  104.                     break;
  105.                 case 3://数字
  106.                     pattern = "/^([+-]?)//d*//.?//d+$/";
  107.                     break;
  108.                 case 4://电话或手机
  109.                     pattern = "/d*//-?//d+$/";
  110.                     break;
  111.                 case 5://正数(正整数 + 0)
  112.                     pattern = "/^[1-9]//d*|0$/";
  113.                     break;
  114.                 case 6://负数(负整数 + 0)
  115.                     pattern = "/^-[1-9]//d*|0$/";
  116.                     break;
  117.                 case 7://浮点数
  118.                     pattern = "/^([+-]?)//d*//.//d+$/";
  119.                     break;
  120.                 case 8://正浮点数
  121.                     pattern = "/^[1-9]//d*.//d*|0.//d*[1-9]//d*$/";
  122.                     break;
  123.                 case 9://负浮点数
  124.                     pattern = "/^-([1-9]//d*.//d*|0.//d*[1-9]//d*)$/";
  125.                     break;
  126.                 case 10://浮点数
  127.                     pattern = "/^-?([1-9]//d*.//d*|0.//d*[1-9]//d*|0?.0+|0)$/";
  128.                     break;
  129.                 case 11://非负浮点数(正浮点数 + 0)
  130.                     pattern = "/^[1-9]//d*.//d*|0.//d*[1-9]//d*|0?.0+|0$/";
  131.                     break;
  132.                 case 12://非正浮点数(负浮点数 + 0)
  133.                     pattern = "/^(-([1-9]//d*.//d*|0.//d*[1-9]//d*))|0?.0+|0$/";
  134.                     break;
  135.                 case 13://邮件
  136.                     pattern = "/^//w+((-//w+)|(//.//w+))*//@[A-Za-z0-9]+((//.|-)[A-Za-z0-9]+)*//.[A-Za-z0-9]+$/";
  137.                     break;
  138.                 case 14://颜色
  139.                     pattern = "/^[a-fA-F0-9]{6}$/";
  140.                     break;
  141.                 case 15://url(http格式的)
  142.                     pattern = "/^http[s]?://([//w-]+//.)+[//w-]+([//w-.///?%&=]*)?$/";
  143.                     break;
  144.                 case 16://仅中文
  145.                     pattern = "/^[//u4E00-//u9FA5//uF900-//uFA2D]+$/";
  146.                     break;
  147.                 case 17://仅ACSII字符
  148.                     pattern = "/^[//x00-//xFF]+$/";
  149.                     break;
  150.                 case 18://邮编
  151.                     pattern = "/^//d{6}$/";
  152.                     break;
  153.                 case 19://手机(13号段和15号段)
  154.                     pattern = "/^(13|15)[0-9]{9}$/";
  155.                     break;
  156.                 case 20://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.                 case 21://非空
  160.                     pattern = "/^//S+$/";
  161.                     break;
  162.                 case 22://图片
  163.                     pattern = "/(.*)//.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$/";
  164.                     break;
  165.                 case 23://压缩文件
  166.                     pattern = "/(.*)//.(rar|zip|7zip|tgz)$/";
  167.                     break;
  168.                 case 24://日期
  169.                     pattern = "/^//d{4}(//-|///|//.)//d{1,2}//1//d{1,2}$/";
  170.                     break;
  171.                 case 25://QQ号码
  172.                     pattern = "/^[1-9]*[1-9][0-9]*$/";
  173.                     break;
  174.                 case 26://国内电话
  175.                     pattern = "/(//d{3}-|//d{4}-)?(//d{8}|//d{7})/";
  176.                     break;
  177.                 case 27://用来用户注册。匹配由数字、26个英文字母或者下划线组成的字符串
  178.                     pattern = "/^(?!//d)[a-zA-Z0-9//u4e00-//u9fa5]+$/";
  179.                     break;
  180.                 case 28://字母
  181.                     pattern = "/^[A-Za-z]+$/";
  182.                     break;
  183.                 case 29://大写字母
  184.                     pattern = "/^[A-Z]+$/";
  185.                     break;
  186.                 case 30://小写字母
  187.                     pattern = "/^[a-z]+$/";
  188.                     break;
  189.                 case 31://身份证
  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 + ")){var err=document.getElementById('" +
  198.                 this.ClientID + "_error');err.innerHTML='';return true;}else{var err=document.getElementById('" + this.ClientID + "_error');err.innerHTML=/"" +
  199.                 (string.IsNullOrEmpty(errorMsg) ? "*" : errorMsg) + "/";return false;}";
  200.             AddAttributes(Page);
  201.         }
  202.         /// <summary>
  203.         /// 为所有具有CausesValidation属性的控件添加检查脚本
  204.         /// </summary>
  205.         /// <param name="ctrl"></param>
  206.         private void AddAttributes(Control ctrl)
  207.         {
  208.             if (ctrl.HasControls())
  209.             {
  210.                 foreach (Control c in ctrl.Controls)
  211.                 {
  212.                     Type t = c.GetType();
  213.                     PropertyInfo causeVal = t.GetProperty("CausesValidation"typeof(bool));
  214.                     if (causeVal != null)
  215.                     {
  216.                         PropertyInfo attr = t.GetProperty("Attributes"typeof(AttributeCollection));
  217.                         AttributeCollection attributes = (AttributeCollection)attr.GetValue(c, null);
  218.                         attributes["onclick"] += "var txt = document.getElementById('" + this.TextBox1.ClientID + "');if(txt.value.match(" + pattern + ")){var err=document.getElementById('" +
  219.                 this.ClientID + "_error');err.innerHTML='';return true;}else{var err=document.getElementById('" + this.ClientID + "_error');err.innerHTML=/"" +
  220.                 (string.IsNullOrEmpty(errorMsg) ? "*" : errorMsg) + "/";return false;}";
  221.                     }
  222.                     AddAttributes(c);
  223.                 }
  224.             }
  225.         }
  226.     }
  227. }

测试网页前台代码:

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值