【最佳實踐系列】一種WPF應用程序數據驗證模式

輸入數據的驗證經常發生在用戶錄入數據後,在對輸入數據進行處理前對其進行檢驗,確定其是否滿足一定的規則。這裏介紹一種經驗法則,用於頻繁的數據驗證過程。

注:下面的例子用到一個用於表示均勻分佈參數設置信息的類

    /// <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數據綁定的驗證技術的一部分,實現更完善的驗證功能,例如錯誤信息突出顯示等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章