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

来源:互联网 发布:mac翻墙回国的软件 编辑:程序博客网 时间:2024/06/01 09:38

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

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

    /// <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数据绑定的验证技术的一部分,实现更完善的验证功能,例如错误信息突出显示等。

0 0