C#中,页面层之简易验证模块

  相信各位编码一段时间UI界面的朋友们,都会跟我这个新手有着一样的想法,每次界面布局控件可能不是我们在做,但是这些控件的值是需要验证的,每新增一个新的页面,页面需要验证的控件代码我们都要一一去书写,实在是很费劲,很让人烦躁啊,而且那一串串长得不得了的If/Else实在让我们难受,情何以堪啊。于是每个人都有了跃跃欲试的想法,那我们就一起来做一个简单的验证模块吧。

  可能有些朋友对于微软的控件印象不好,但是我个人觉得它还是有很大的潜力的,不然也不会有那么多收费的控件,介于用户控件的基础上加上基础控件我们可以做出很理想的一套框架哦,需要一步步的往下扩展,呵呵。

  首先验证嘛,其实就是对于当前控件输入的数据进行验证,并在验证结果产生之后让控件表现出不同的状态。于是乎我们就需要一个基类,来定义一些共有的方法,也就是接口。

  代码如下:

 1 /// <summary>
2 /// 程序说明:基础控件
3 /// 创建作者:ahl5esoft
4 /// 创建时间:2011-08-31
5 /// </summary>
6 public abstract class BaseControl : UserControl
7 {
8 #region 变量
9
10 /// <summary>
11 /// 当前控件
12 /// </summary>
13 protected WebControl control;
14
15 #endregion
16
17 #region 方法
18
19 /// <summary>
20 /// 设置值
21 /// </summary>
22 /// <returns></returns>
23 public abstract void SetValue(string value);
24
25 /// <summary>
26 /// 获取值
27 /// </summary>
28 /// <returns></returns>
29 public abstract string GetValue();
30
31 /// <summary>
32 /// 设置控件
33 /// </summary>
34 /// <param name="control"></param>
35 public void SetControl(WebControl control)
36 {
37 this.control = control;
38 }
39
40 /// <summary>
41 /// 添加客户端事件
42 /// </summary>
43 /// <param name="jsEventName">客户端js事件名</param>
44 /// <param name="script">脚本</param>
45 public void AddClientEvent(string jsEventName, string script)
46 {
47 this.control.Attributes.Add(jsEventName, script);
48 }
49
50 /// <summary>
51 /// 设置客户端验证
52 /// </summary>
53 /// <param name="jsEventName">客户端js事件名</param>
54 /// <param name="validateType">验证类型</param>
55 /// <param name="minLength">数据最小长度,为0时表示数据可为空或Null.</param>
56 /// <param name="maxLength">数据最大长度,为0时表示数据没有最大长度限制.</param>
57 public void SetValidate(string jsEventName, ValidateEnum validateType, int minLength, int maxLength)
58 {
59 //添加客户端验证事件
60 }
61
62 #endregion
63 }

  代码内的ValidateEnum是验证类型枚举,列举了你当前所有的验证类型。

  有了以上的共用控件基类,我们就需要一一创建自定义的基础控件了,例如:TextBox、CheckBox、DropDownList了。

  自定义的TextBox示例代码如下:

  前端:

1 <asp:TextBox ID="textBox" runat="server"></asp:TextBox>

  后台:

 1 #region 控件事件
2
3 /// <summary>
4 /// 控件加载
5 /// </summary>
6 /// <param name="sender"></param>
7 /// <param name="e"></param>
8 protected void Page_Load(object sender, EventArgs e)
9 {
10 this.SetControl(this.textBox);
11 }
12
13 #endregion
14
15 #region 方法
16
17 /// <summary>
18 /// 设置值
19 /// </summary>
20 /// <param name="value"></param>
21 public override void SetValue(string value)
22 {
23 this.textBox.Text = value;
24 }
25
26 /// <summary>
27 /// 获取值
28 /// </summary>
29 /// <returns></returns>
30 public override string GetValue()
31 {
32 return this.textBox.Text;
33 }
34
35 #endregion

  因为TextBox需要控制的比较少,所以代码比较简单。

  有了基础的控件之后,我们接下来要做的就是验证类了。

  同样,先是验证基类的代码:

 1 /// <summary>
2 /// 程序说明:验证基类
3 /// 创建作者:ahl5esoft
4 /// 创建时间:2011-09-30
5 /// </summary>
6 public abstract class AbstractValidate
7 {
8 #region 变量
9
10 /// <summary>
11 /// 数据最小长度,为0时表示数据可为空或Null.
12 /// </summary>
13 int minLength;
14
15 /// <summary>
16 /// 数据最大长度,为0时表示数据没有最大长度限制.
17 /// </summary>
18 int maxLength;
19
20 /// <summary>
21 /// 控件值
22 /// </summary>
23 protected string controlValue;
24
25 #endregion
26
27 #region 构造函数
28
29 /// <summary>
30 /// 有参构造函数
31 /// </summary>
32 /// <param name="controlValue">控件值</param>
33 /// <param name="minLength">数据最小长度,为0时表示数据可为空或Null.</param>
34 /// <param name="maxLength">数据最大长度,为0时表示数据没有最大长度限制.</param>
35 public AbstractValidate(string controlValue, int minLength, int maxLength)
36 {
37 //赋值
38 }
39
40 #endregion
41
42 #region 方法
43
44 /// <summary>
45 /// 验证
46 /// </summary>
47 /// <returns></returns>
48 public bool Validate()
49 {
50 return this.ValidateLength() && this.ValidateValue();
51 }
52
53 /// <summary>
54 /// 验证值
55 /// </summary>
56 /// <returns></returns>
57 protected abstract bool ValidateValue();
58
59 /// <summary>
60 /// 验证长度
61 /// </summary>
62 /// <returns></returns>
63 bool ValidateLength()
64 {
65 //验证控制值长度是否符合
66 }
67
68 #endregion
69 }

  需要验证数据为纯数字、纯字母、中文或者某些规则等。

  验证纯数字代码如下:

 1 /// <summary>
2 /// 程序说明:验证纯数字
3 /// 创建作者:ahl5esoft
4 /// 创建时间:2011-09-30
5 /// </summary>
6 public class PureNumberValidate : AbstractValidate
7 {
8 #region 构造函数
9
10 /// <summary>
11 /// 有参构造函数
12 /// </summary>
13 /// <param name="controlValue">控件值</param>
14 /// <param name="minLength">数据最小长度,为0时表示数据可为空或Null.</param>
15 /// <param name="maxLength">数据最大长度,为0时表示数据没有最大长度限制.</param>
16 public PureNumberValidate(string controlValue, int minLength, int maxLength)
17 : base(controlValue, minLength, maxLength)
18 { }
19
20 #endregion
21
22 #region 方法
23
24 /// <summary>
25 /// 验证值
26 /// </summary>
27 protected override bool ValidateValue()
28 {
29 Regex reg = new Regex(@"^\d+$");
30 return reg.IsMatch(this.controlValue);
31 }
32
33 #endregion
34 }

  自定义控件、验证的类都已经准备好了,这时候我们就只是需要收集验证列表,对列表统一验证了。

 1 /// <summary>
2 /// 程序说明:验证帮助类
3 /// 创建作者:ahl
4 /// 创建时间:2011-09-30
5 /// </summary>
6 public class ValidateHelper
7 {
8 #region 变量
9
10 /// <summary>
11 /// 验证列表
12 /// </summary>
13 IList<AbstractValidate> validateList = new List<AbstractValidate>();
14
15 /// <summary>
16 /// 控件名列表
17 /// </summary>
18 IList<string> controlNameList = new List<string>();
19
20 #endregion
21
22 #region 属性
23
24 /// <summary>
25 /// 错误信息列表
26 /// </summary>
27 public IList<string> ErrorMessageList { get; private set; }
28
29 #endregion
30
31 #region 方法
32
33 /// <summary>
34 /// 添加验证
35 /// </summary>
36 /// <param name="contorlName">控件名</param>
37 /// <param name="baseControl">控件</param>
38 /// <param name="jsEventName">客户端js事件名</param>
39 /// <param name="validateType">验证类型</param>
40 /// <param name="minLength">数据最小长度,为0时表示数据可为空或Null.</param>
41 /// <param name="maxLength">数据最大长度,为0时表示数据没有最大长度限制.</param>
42 public void Add(string contorlName, BaseControl baseControl, string jsEventName, ValidateEnum validateType, int minLength, int maxLength)
43 {
44 //根据ValidateEnum获取反射出对应的AbstractValidate对象,
45 //此处暂时使用PureNumberValidate替代
46 AbstractValidate validateObj = new PureNumberValidate(baseControl.GetValue(), minLength, maxLength);
47 this.validateList.Add(validateObj);
48 this.controlNameList.Add(contorlName);
49 }
50
51 /// <summary>
52 /// 验证
53 /// </summary>
54 /// <returns></returns>
55 public bool Validate()
56 {
57 this.ErrorMessageList.Clear();
58 //进行验证,验证失败则添加错误信息列表
59 }
60
61 #endregion
62 }

  这样我们简易的验证模块就完成了,但是随着验证类型的不断增加,验证类也是大大的增加啊,仍然还是有不少工作。于是我们既然会想到利用XML去配置验证类型。

1 <?xml version="1.0" encoding="utf-8" ?>
2 <root>
3 <validate name="PrueNumber" reg="^\d+$"/>
4 </root>

  可以配置如上格式,总之是按照自己的习惯。

  接着我们只需要修改ValidateHelper、AbstractValidate,然后把以上的AbstractValidate的派生类都给删除掉了。

  ValidateHelper修改后的代码如下:

 1 /// <summary>
2 /// 添加验证
3 /// </summary>
4 /// <param name="contorlName">控件名</param>
5 /// <param name="baseControl">控件</param>
6 /// <param name="jsEventName">客户端js事件名</param>
7 /// <param name="validateType">验证类型</param>
8 /// <param name="minLength">数据最小长度,为0时表示数据可为空或Null.</param>
9 /// <param name="maxLength">数据最大长度,为0时表示数据没有最大长度限制.</param>
10 public void Add(string contorlName, BaseControl baseControl, string jsEventName, ValidateEnum validateType, int minLength, int maxLength)
11 {
12 baseControl.SetValidate(jsEventName, validateType, minLength, maxLength);
13 this.validateList.Add(new ValidateClass(contorlName, baseControl, validateType, minLength, maxLength));
14 }
15
16 /// <summary>
17 /// 验证
18 /// </summary>
19 /// <returns></returns>
20 public bool Validate()
21 {
22 this.ErrorMessageList.Clear();
23 bool result = true;
24 foreach (var validateObj in this.validateList)
25 {
26 if (validateObj.Validate())
27 {
28 if (result)
29 {
30 result = false;
31 }
32 }
33 else
34 {
35 this.ErrorMessageList.Add(validateObj.ErrorMessage);
36 }
37 }
38 return result;
39 }
40
41 #endregion

  因为AbstractValidate不再需要派生类了,因此需要修改为其他类名。

  修改后的代码如下:

#region 属性

/// <summary>
/// 控件名
/// </summary>
string controlName { get; set; }

/// <summary>
/// 控件对象
/// </summary>
BaseControl controlObj { get; set; }

/// <summary>
/// 最小长度
/// </summary>
int minLength { get; set; }

/// <summary>
/// 最大长度
/// </summary>
int maxLength { get; set; }

/// <summary>
/// 验证正则
/// </summary>
string reg { get; set; }

#endregion

#region 属性

/// <summary>
/// 错误信息
/// </summary>
public string ErrorMessage { get; set; }

#endregion

#region 构造函数

/// <summary>
/// 有参构造函数
/// </summary>
/// <param name="contorlName">控件名</param>
/// <param name="baseControl">控件</param>
/// <param name="validateType">验证类型</param>
/// <param name="minLength">数据最小长度,为0时表示数据可为空或Null.</param>
/// <param name="maxLength">数据最大长度,为0时表示数据没有最大长度限制.</param>
public ValidateClass(string contorlName, BaseControl baseControl, ValidateEnum validateType, int minLength, int maxLength)
{
//赋值
//获取验证XML的配置,可以用单例模式存储在IDictionary<ValidateEnum,string>
IDictionary<ValidateEnum, string> dicReg;//代码省略
this.reg = dicReg[validateType];
}

#endregion

#region 方法

/// <summary>
/// 验证
/// </summary>
/// <returns></returns>
public bool Validate()
{
bool result = this.ValidateLength() && this.ValidateValue();
if (!result)
{
//改变控件状态
//验证失败的组合错误信息
}
return result;
}

/// <summary>
/// 验证值
/// </summary>
/// <returns></returns>
protected bool ValidateValue()
{
//代码略
}

/// <summary>
/// 验证长度
/// </summary>
/// <returns></returns>
bool ValidateLength()
{
//代码略
}

#endregion

  到这里,我们就基本上完成了简单的验证模块了,大家有其他的想法可以告诉我,也让完善下自己的验证模块。有错误的地方请指出,谢谢。

posted @ 2011-09-30 12:58  ahl5esoft  阅读(1904)  评论(8编辑  收藏  举报