[XAML学习资料] 验证用户提供的数据ValidationRule
2009-01-10 13:16
429 查看
在打开对话框以及用户提供所需的数据时,对话框负责确保提供的数据有效,原因如下:
从安全角度讲,应验证所有输入。
从特定于域的角度讲,数据验证可防止该代码处理错误的数据,因为这样可能会引发异常。
从用户体验的角度讲,对话框可以通过向用户显示哪些输入数据无效来为用户提供帮助。
从性能角度讲,多层应用程序中的数据验证可以减少客户端和应用程序层之间的往返次数,尤其是在该应用程序由 Web 服务或基于服务器的数据库组成时。
若要验证 WPF 中的绑定控件,您需要定义验证规则,然后将其与该绑定关联。验证规则是派生自 ValidationRule 的自定义类。下面的示例演示验证规则 MarginValidationRule,该规则检查绑定值是否是 Double 以及是否位于指定的范围内。
1 using System.Globalization;
2 using System.Windows.Controls;
3
4 namespace SDKSample
5 {
6 public class MarginValidationRule : ValidationRule
7 {
8 double minMargin;
9 double maxMargin;
public double MinMargin
{
get { return this.minMargin; }
set { this.minMargin = value; }
}
public double MaxMargin
{
get { return this.maxMargin; }
set { this.maxMargin = value; }
}
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
double margin;
// Is a number?
if (!double.TryParse((string)value, out margin))
{
return new ValidationResult(false, "不是数字!");
}
// Is in range?
if ((margin < this.minMargin) || (margin > this.maxMargin))
{
string msg = string.Format("Margin必须在{0} 和{1}之间.", this.minMargin, this.maxMargin);
return new ValidationResult(false, msg);
}
// Number is valid
return new ValidationResult(true, null);
}
}
}
在XAML中将其与控件绑定,具体代码如下所示:
1 <TextBox Name="leftMarginTextBox" Grid.Column="1" Grid.Row="0">
2 <TextBox.Text>
3 <Binding Path="Left" UpdateSourceTrigger="PropertyChanged">
4 <Binding.ValidationRules>
5 <local:MarginValidationRule MinMargin="0" MaxMargin="10" />
6 </Binding.ValidationRules>
7 </Binding>
8 </TextBox.Text>
9 </TextBox>
如果在TextBox输入不符合规则的,将会提示上述返回的msg内容,并且 WPF 将在无效控件周围显示一个红色边框,这样就可以提示用户输入并非所需要的数据。在用户输入有效数据之前,WPF 不会将用户限制于无效的控件。这对于对话框来说是很有利的;无论数据是否有效,用户都应当能够在对话框中自由导航控件。但是,这意味着用户可以输入无效的数据,然后按“确定”按钮。因此,在按“确定”按钮时,您的代码还需要通过处理 Click 事件来验证对话框中的所有控件。
1 void okButton_Click(object sender, RoutedEventArgs e)
2 {
3 // Don't accept the dialog box if there is invalid data
4 if (!IsValid(this)) return;
5
6
7
8
9
}
// Validate all dependency objects in a window
bool IsValid(DependencyObject node)
{
// Check if dependency object was passed
if (node != null)
{
// Check if dependency object is valid.
// NOTE: Validation.GetHasError works for controls that have validation rules attached
bool isValid = !Validation.GetHasError(node);
if (!isValid)
{
// If the dependency object is invalid, and it can receive the focus,
// set the focus
if (node is IInputElement) Keyboard.Focus((IInputElement)node);
return false;
}
}
// If this dependency object is valid, check all child dependency objects
foreach (object subnode in LogicalTreeHelper.GetChildren(node))
{
if (subnode is DependencyObject)
{
// If a child dependency object is invalid, return false immediately,
// otherwise keep checking
if (IsValid((DependencyObject)subnode) == false) return false;
}
}
// All dependency objects are valid
return true;
}
}
}
这个和ASP.NET的客户端验证控件一样,客户端虽然验证了,但是服务端最好同时验证,以免非法入侵者不通过客户端直接向服务的发送数据!!!验证规则只是提示用户,最终数据还是要在程序中验证的!!! 此代码将在窗口上枚举所有依赖项对象。如果有任何一个对象无效(由 GetHasError 返回),则此无效的控件将获得焦点,IsValid 方法将返回 false 并将该窗口视为无效。一旦对话框有效,则可以安全地关闭并返回。在返回过程中,需要向调用函数返回一个结果。
注:本文大部分内容和例子来自于MSDN!
从安全角度讲,应验证所有输入。
从特定于域的角度讲,数据验证可防止该代码处理错误的数据,因为这样可能会引发异常。
从用户体验的角度讲,对话框可以通过向用户显示哪些输入数据无效来为用户提供帮助。
从性能角度讲,多层应用程序中的数据验证可以减少客户端和应用程序层之间的往返次数,尤其是在该应用程序由 Web 服务或基于服务器的数据库组成时。
若要验证 WPF 中的绑定控件,您需要定义验证规则,然后将其与该绑定关联。验证规则是派生自 ValidationRule 的自定义类。下面的示例演示验证规则 MarginValidationRule,该规则检查绑定值是否是 Double 以及是否位于指定的范围内。
1 using System.Globalization;
2 using System.Windows.Controls;
3
4 namespace SDKSample
5 {
6 public class MarginValidationRule : ValidationRule
7 {
8 double minMargin;
9 double maxMargin;
public double MinMargin
{
get { return this.minMargin; }
set { this.minMargin = value; }
}
public double MaxMargin
{
get { return this.maxMargin; }
set { this.maxMargin = value; }
}
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
double margin;
// Is a number?
if (!double.TryParse((string)value, out margin))
{
return new ValidationResult(false, "不是数字!");
}
// Is in range?
if ((margin < this.minMargin) || (margin > this.maxMargin))
{
string msg = string.Format("Margin必须在{0} 和{1}之间.", this.minMargin, this.maxMargin);
return new ValidationResult(false, msg);
}
// Number is valid
return new ValidationResult(true, null);
}
}
}
在XAML中将其与控件绑定,具体代码如下所示:
1 <TextBox Name="leftMarginTextBox" Grid.Column="1" Grid.Row="0">
2 <TextBox.Text>
3 <Binding Path="Left" UpdateSourceTrigger="PropertyChanged">
4 <Binding.ValidationRules>
5 <local:MarginValidationRule MinMargin="0" MaxMargin="10" />
6 </Binding.ValidationRules>
7 </Binding>
8 </TextBox.Text>
9 </TextBox>
如果在TextBox输入不符合规则的,将会提示上述返回的msg内容,并且 WPF 将在无效控件周围显示一个红色边框,这样就可以提示用户输入并非所需要的数据。在用户输入有效数据之前,WPF 不会将用户限制于无效的控件。这对于对话框来说是很有利的;无论数据是否有效,用户都应当能够在对话框中自由导航控件。但是,这意味着用户可以输入无效的数据,然后按“确定”按钮。因此,在按“确定”按钮时,您的代码还需要通过处理 Click 事件来验证对话框中的所有控件。
1 void okButton_Click(object sender, RoutedEventArgs e)
2 {
3 // Don't accept the dialog box if there is invalid data
4 if (!IsValid(this)) return;
5
6
7
8
9
}
// Validate all dependency objects in a window
bool IsValid(DependencyObject node)
{
// Check if dependency object was passed
if (node != null)
{
// Check if dependency object is valid.
// NOTE: Validation.GetHasError works for controls that have validation rules attached
bool isValid = !Validation.GetHasError(node);
if (!isValid)
{
// If the dependency object is invalid, and it can receive the focus,
// set the focus
if (node is IInputElement) Keyboard.Focus((IInputElement)node);
return false;
}
}
// If this dependency object is valid, check all child dependency objects
foreach (object subnode in LogicalTreeHelper.GetChildren(node))
{
if (subnode is DependencyObject)
{
// If a child dependency object is invalid, return false immediately,
// otherwise keep checking
if (IsValid((DependencyObject)subnode) == false) return false;
}
}
// All dependency objects are valid
return true;
}
}
}
这个和ASP.NET的客户端验证控件一样,客户端虽然验证了,但是服务端最好同时验证,以免非法入侵者不通过客户端直接向服务的发送数据!!!验证规则只是提示用户,最终数据还是要在程序中验证的!!! 此代码将在窗口上枚举所有依赖项对象。如果有任何一个对象无效(由 GetHasError 返回),则此无效的控件将获得焦点,IsValid 方法将返回 false 并将该窗口视为无效。一旦对话框有效,则可以安全地关闭并返回。在返回过程中,需要向调用函数返回一个结果。
注:本文大部分内容和例子来自于MSDN!
相关文章推荐
- 一步步学习SPD2010--第十四章节--在Web页面使用控件(3)--验证用户数据输入
- MVC3学习第七章 排山倒海第三变----利用MVC3实现数据验证以及完成用户数据的编辑
- 在WPF对话框中如何验证用户提供的数据
- 一步步学习SPD2010--第十四章节--在Web页面使用控件(3)--验证用户数据输入
- 在WPF对话框中如何验证用户提供的数据
- Activiti学习资料(同步或者重构Activiti Identify用户数据)
- 电商大数据学习笔记:用户画像
- SpringMVC数据验证——注册用户格式的验证实例
- 数据挖掘学习05 - 使用R对文本进行hierarchical cluster并验证结果
- Android学习-内容提供器 数据共享
- Java学习资料-java基本数据类型
- 机器学习&数据挖掘学习资料搜集
- 每日学习总结:DropDownList是否已选择验证、存储过程参数为sql字符串问题、将截断字符串或二进制数据。\r\n语句已终止
- 用户注册信息的验证与数据回显
- 【Hibernate学习笔记】分层数据验证
- jmeter学习—003——使用CSV Data Set Config参数化数据不重复的多次循环执行(实现多用户多笔投资不同项目功能)
- Struts2学习总结(九):数据验证
- 【区块链108将】通过社交整合币种信息,给用户提供良好的学习环境
- 使用2000中的VBScript接口能够转换数据并向用户提供报告
- 微信小程序用户数据的签名验证和加解密