輸入數據的驗證經常發生在用戶錄入數據後,在對輸入數據進行處理前對其進行檢驗,確定其是否滿足一定的規則。這裏介紹一種經驗法則,用於頻繁的數據驗證過程。
注:下面的例子用到一個用於表示均勻分佈參數設置信息的類
/// <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數據綁定的驗證技術的一部分,實現更完善的驗證功能,例如錯誤信息突出顯示等。