数据输入表单的数据验证与错误处理
立即解锁
发布时间: 2025-08-13 02:53:31 阅读量: 23 订阅数: 25 

### 数据输入表单的数据验证与错误处理
在开发业务应用程序时,数据验证是确保数据准确性和完整性的重要环节。本文将介绍数据验证的相关知识,包括不同类型的验证、验证规则的定义以及如何将验证错误暴露给用户界面。
#### 1. DataGrid 控件的验证功能
DataGrid 控件与 DataForm 控件类似,内置了 ValidationSummary 控件。当当前行存在绑定实体/对象报告的验证错误时,该控件会显示出来。验证错误会导致行的背景颜色变为浅红色,并且当具有关联验证错误的单元格获得焦点时,会显示红色边框和解释验证错误原因的工具提示。
在所有验证错误修复之前,用户无法修改或添加其他行。如果绑定的对象实现了 IEditableObject 接口,用户可以按 Esc 键(如果字段当前处于编辑模式则按两次,否则按一次)来取消更改,DataGrid 控件会调用该对象的 CancelEdit 方法,将对象恢复到编辑开始前的状态。
#### 2. 数据验证的类型
在业务应用中,通常需要执行三种类型的数据验证:
- **属性级验证**:与单个属性相关的一个或多个验证规则,通常只验证单个属性的值,不依赖对象的其他属性。例如,确保分配给属性的数值在给定范围内。属性级验证在属性值更新(在其 setter 中)以及验证整个对象时执行。
- **对象级验证**:每个验证规则通常涉及单个对象的多个属性的值。例如,确保结束日期在开始日期之后。对象级验证在提交对象的所有更改时执行(通常在实现 IEditableObject 接口后调用 EndEdit 方法)。
- **域级验证**:将整个对象层次结构作为一个整体,根据一组验证规则进行验证,验证规则跨越多个对象。例如,确保下单时库存中有足够的商品来完成订单。域级验证通常在将更改提交回服务器时执行,并且通常在服务器端进行。
本文主要关注属性级和对象级验证的实现。
#### 3. 定义验证规则
通过 RIA 服务从服务器公开实体/对象时,可以使用验证属性在基于服务器的实体/对象上定义属性级和对象级验证规则,这些规则会被复制到客户端创建的相应实体上。
验证规则在客户端复制后,数据在输入时可以在客户端进行验证,提交数据时会在服务器端再次运行。可以使用验证属性指定属性级和对象级验证规则,也可以在自己的客户端类(如 ViewModel)中使用这些属性。只需添加对 System.ComponentModel.DataAnnotations 命名空间的引用,就可以使用如 Required、StringLength、Range、RegularExpression 等验证属性。
以下是一些示例代码:
```csharp
[Required]
[StringLength(50)]
[RegularExpression(@"(?<user>[^@]+)@(?<host>.+)")]
public string EmailAddress;
[Range(0, 150)]
public int Age;
```
预定义的验证属性都是属性级规则。要定义对象级验证规则,需要创建一个继承自 ValidationAttribute 类的自定义验证属性。以下是一个确保产品销售结束日期晚于销售开始日期的自定义验证规则示例:
```csharp
public class SellDatesValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
Product product = value as Product;
return product.SellEndDate > product.SellStartDate ?
ValidationResult.Success : new ValidationResult(
"The sell end date must be greater than the sell start date");
}
}
[SellDatesValidation]
public class Product
```
当然,也可以用同样的方式创建自定义属性级验证属性。
#### 4. 将验证错误暴露给用户界面
在 Silverlight 中,有几种方法可以将实体/对象的数据验证错误报告给用户界面:
- 抛出异常
- 实现 IDataErrorInfo 接口
- 实现 INotifyDataErrorInfo 接口
以下是对这三种方法的详细介绍:
##### 4.1 通过异常进行验证
在 Silverlight 4 之前,通知用户界面属性级数据验证错误的唯一方法是在属性的 setter 中抛出异常,通常使用 ValidationException 异常。以下是一个使用异常方法验证属性值并通知用户界面数据验证错误的示例:
```csharp
public string Name
{
get { return name; }
set
{
name = value;
// Check validation rule
if (string.IsNullOrEmpty(value))
throw new ValidationException("You must enter a name for the product");
}
}
```
如果将绑定的 ValidatesOnExceptions 属性设置为 True,则通过控件为属性赋值时抛出的任何异常都将被绑定视为验证错误。要在代码中处理验证错误,绑定的 NotifyOnValidationError 属性必须为 True(其默认值为 True),并且必须将 ValidatesOnExceptions 属性显式设置为 True,这将导致绑定控件上引发 BindingValidationError 事件。
以下是一个典型的绑定示例:
```xml
<TextBox Text="{Binding Path=Name, Mode=TwoWay, NotifyOnValidationError=True,
ValidatesOnExceptions=True}"
BindingValidationError="NameTextBox_BindingValidationError" />
```
处理 BindingValidationError 事件的代码如下:
```csharp
private void NameTextBox_BindingValidationError(object sender,
ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
{
// Do something with the error
string errorMessage = e.Error.ErrorContent.ToString();
}
}
```
##### 4.2 IDataErrorInfo 接口
将数据验证错误作为异常抛出的方法并不受大多数开发者欢迎,因为概念上数据验证错误并非“异常”情况,而且在调试应用程序时,每次因数据验证错误抛出异常都会导致应用程序执行中断。
WPF 提供了一种更好的处理数据验证的方法,即实现 IDataErrorInfo 接口,通过 Error 和 Item 两个属性暴露实体/对象的验证错误,无需抛出异常。这些属性可以报告实体/对象的所有验证错误,而不仅仅是正在更新的属性的错误。
以下是一个简单类实现 IDataErrorInfo 接口的示例:
```csharp
public class Product : IDataErrorInfo , INotifyPropertyChanged
{
private string name;
private Dictionary<string, string> validationErrors =
new Dictionary<string, string>();
public string Name
{
get { return name; }
set
{
name = value;
// Check validation rule
if (string.IsNullOrEmpty(value))
{
validationErrors["Name"] =
"You must enter a name for the product";
}
else
{
if (validationErrors.ContainsKey("Name"))
validationErrors.Remove("Name");
}
RaisePropertyChanged("Name");
}
}
public string Error
{
get
{
string error = "";
if (validationErrors.Count != 0)
```
0
0
复制全文
相关推荐










