【最佳实践系列】一种WPF应用程序数据验证模式

原创 2015年11月15日 14:22:13

输入数据的验证经常发生在用户录入数据后,在对输入数据进行处理前对其进行检验,确定其是否满足一定的规则。这里介绍一种经验法则,用于频繁的数据验证过程。

注:下面的例子用到一个用于表示均匀分布参数设置信息的类

    /// <summary>
    /// 均匀分布类
    /// </summary>
    public class UniformDistribution
    {
        public double LowerLimit { get; set; }
        public double UpperLimit { get; set; }
        public UniformDistribution(double lw, double up)
        {
            LowerLimit = lw;
            UpperLimit = up;
        }
    }

1、定义一个验证返回类型VerifyResult,其中包含一个int类型的故障码,一个string类型的故障消息,以及一个作为返回值的对象。

    /// <summary>
    /// 验证返回结果类
    /// </summary>
    public class VerifyResult
    {
        public int Code { get; set; }
        public string Message { get; set; }
        public object ReturnedValue { get; set; }
        public bool IsPass
        {
            get { return Code == 0; }
        }
        //构造函数
        public VerifyResult()
        {
            Code = 0; //默认0为通过验证标识
            Message = string.Empty;
            ReturnedValue = null;
        }
    }

2、定义一个类包装验证方法库,由简到繁实现层次化的数据验证

    /// <summary>
    /// 验证方法库类
    /// </summary>
    public class Verifier
    {
        //基本验证:输入正实数
        public static VerifyResult PositiveNumberVerifer(string content)
        {
            VerifyResult result = new VerifyResult();
            double value = 0;
            if (!double.TryParse(content, out value))
            {
                //浮点数解析失败则添加相应错误信息
                result.Code = -1; //给定一个错误码
                result.Message = "请输入数值...";
            }
            else if (value < 0)
            {
                //解析成功但为负数,同样添加相应错误信息
                result.Code = -2; 
                result.Message = "请输入一个正数...";
            }
            else
                result.ReturnedValue = value;
            return result;
        }

        //组合验证器
        public static VerifyResult UniformSettingVerifer(string lowerLimitStr, string upperLimitStr)
        {
            VerifyResult result = new VerifyResult();
            //调用低层次验证器作数字验证
            VerifyResult lowerLimitResult = PositiveNumberVerifer(lowerLimitStr);
            VerifyResult upperLimitResult = PositiveNumberVerifer(upperLimitStr);
            //补充组合验证法则
            if (lowerLimitResult.Code < 0)
            {
                result.Code = -1;
                //组合错误消息
                result.Message = "下限设置格式有误!" + lowerLimitResult.Message;
            }
            else if (upperLimitResult.Code < 0)
            {
                result.Code = -2;
                result.Message = "上限设置格式有误!" + upperLimitResult.Message;
            }
            else if (lowerLimitResult.Code == 0 && upperLimitResult.Code == 0)
            {
                //高层次验证
                if ((double)lowerLimitResult.ReturnedValue > (double)upperLimitResult.ReturnedValue)
                {
                    result.Code = -3;
                    result.Message = "下限值不能大于上限值...";
                }
                else
                {
                    //所有验证通过,构造返回值对象
                    result.ReturnedValue = new UniformDistribution((double)lowerLimitResult.ReturnedValue,
                        (double)upperLimitResult.ReturnedValue);
                }
            }
            return result;
        }
    }
3、在应用程序中使用输入数据前调用相应的验证函数对数据进行检查,若不返回错误码则继续下一步的处理,否则应通过MessageBox显示错误信息

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //测试数据验证功能:界面中包含两个文本框tbLowerLimit和tbUpperLimit
            var verify = Verifier.UniformSettingVerifer(tbLowerLimit.Text, tbUpperLimit.Text);
            if (verify.IsPass)
            {
                //使用输入的数据
                var uniform = verify.ReturnedValue as UniformDistribution;
                MessageBox.Show("通过验证");
            }
            else
            {
                MessageBox.Show(verify.Message);
            }
        }
当然,这种方法可以作为WPF数据绑定的验证技术的一部分,实现更完善的验证功能,例如错误信息突出显示等。

Git学习系列(九)—— Git的版本控制的最佳实践

参考: http://www.ruanyifeng.com/blog/2012/07/git.html (阮一峰) http://segmentfault.com/a/11900000004...
  • u013144121
  • u013144121
  • 2015年01月05日 17:23
  • 662

MVP模式在Android开发中的最佳实践

这篇文章拖了好久了,一直存在草稿箱里没有继续写,趁几天有空,撸撸完。回想一下,你刚刚学习Android的时候,总会看到一些书上写着,Android使用的是MVC模式,Activity就是一个Contr...
  • sbsujjbcy
  • sbsujjbcy
  • 2016年02月21日 13:47
  • 5158

业内docker技巧和最佳实践的想法

业内docker技巧和最佳实践的想法
  • yangzhenping
  • yangzhenping
  • 2015年01月20日 16:50
  • 3238

Mysql数据库优化系列(三)------Mysql性能调优的思路

一、最好的优化-----不查询! 这不是开玩笑. 如果一台服务器出现长时间负载过高 /周期性负载过大,或偶尔卡住,如何来处理? 大的思路--------         是周期性的...
  • wuming19900801
  • wuming19900801
  • 2014年12月27日 15:57
  • 1043

从无到有系列之Hive-hive全实战hive05

文章出处:http://blog.csdn.net/sdksdk0/article/details/51675005 作者: 朱培          ID:sdksdk0 Hive环境...
  • wang1472jian1110
  • wang1472jian1110
  • 2016年11月22日 17:51
  • 503

理解和使用WPF 验证机制

首先建立一个demo用以学习和实验WPF Data Validation机制。创建一个数据实体类: public class Employee {     public string Nam...
  • gentle_wolf
  • gentle_wolf
  • 2013年06月20日 11:15
  • 7912

《软件需求最佳实践》与《掌握需求过程》对比

最近公司要考察需求技能,抱着总结经验,提升技能的心态,看了两本关于需求的书籍,一本是被公司奉为需求人员教科书的《软件需求最佳实践》徐峰著,一本是《掌握需求过程第三版》James Robertson著。...
  • happymatilian
  • happymatilian
  • 2016年10月27日 16:40
  • 1627

Angular 2 – 提升水平的最佳实践

Angular 2 正在全世界范围流传并且变得越来越受欢迎,因此越来越多的人开始学习并使用它。然而,不论你是编程专家还是初学者,当你使用 Angular 2 时,这里有一些你应该遵循的基本指导原则和实...
  • fidelhl
  • fidelhl
  • 2017年02月13日 10:37
  • 1160

20个数据库设计最佳实践

能够最佳的使用好数据库需要扎实的基础,下面文章详细的说明了20个数据库设计的最佳实践,很适合是实习的程序员学习。 使用明确、统一的标明和列名,例如 Sch...
  • www19940501a
  • www19940501a
  • 2013年07月01日 23:43
  • 966

MVC实用构架设计(三)——EF-Code First(6):数据更新最佳实践

前言   最近在整理EntityFramework数据更新的代码,颇有体会,觉得有分享的价值,于是记录下来,让需要的人少走些弯路也是好的。   为方便起见,先创建一个控制台工程,使用usi...
  • dz45693
  • dz45693
  • 2016年04月11日 13:25
  • 1244
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【最佳实践系列】一种WPF应用程序数据验证模式
举报原因:
原因补充:

(最多只允许输入30个字)