ASP.NET 2.0数据教程之二:创建一个业务逻辑层
[2] ASP.NET 2.0数据教程之二:创建一个业务逻辑层
[3] ASP.NET 2.0数据教程之二:创建一个业务逻辑层
[4] ASP.NET 2.0数据教程之二:创建一个业务逻辑层
[5] ASP.NET 2.0数据教程之二:创建一个业务逻辑层
[6] ASP.NET 2.0数据教程之二:创建一个业务逻辑层
[7] ASP.NET 2.0数据教程之二:创建一个业务逻辑层
系列文章导航:
ASP.NET 2.0数据教程之四:使用ObjectDataSource展现数据
ASP.NET 2.0数据教程之六:编程设置ObjectDataSource的参数值
ASP.NET 2.0数据教程之七:使用DropDownList过滤的主/从报表
ASP.NET 2.0数据教程之八:使用两个DropDownList过滤的主/从报表
ASP.NET 2.0数据教程之十:使用 GridView 和DetailView实现的主/从报表
ASP.NET 2.0数据教程之十一:基于数据的自定义格式化
ASP.NET 2.0数据教程之十二:在GridView控件中使用TemplateField
第三步:给DataRow添加字段级验证
字段级验证是指在插入或更新时检查业务对象所涉及到的所有属性值。拿产品来举个例,某些字段级的验证规则如下所示:
· ProductName字段不得超过40个字符
· QuantityPerUnit字段不得超过20个字符
· ProductID、ProductName以及Discontinued字段是必填的,而其他字段则是可填可不填的
· UnitPrice、UnitsInStock、UnitsOnOrder以及ReorderLevel字段不得小于0
这些规则可以或者说是应该在数据库层被描述出来。ProductName和QuantityPerUnit字段上的字符数限制可以通过Products表中相应列的数据类型来实现(分别为nvarchar(40) and nvarchar(20))。字段“是否必填”可以通过将数据库中表的相应列设置为“允许为NULL”来实现。为了保证UnitPrice、UnitsInStock、UnitsOnOrder以及ReorderLevel字段的值不小于0,可以分别在它们的相应列上加一个约束。
除了在数据库中应用了这些规则之外,它们同时也将被其应用在DataSet上。事实上,字段长度和是否允许为空等信息已经被应用到了各DataTable的DataColumn集合中。我们可以在数据集设计器(DataSet Designer)中看到已经存在的字段级验证,从某个DataTable中选择一个字段,然后在属性窗口中就可以找到了。如图四所示,ProductDataTable中的QuantityPerUnit字段允许空值并且最大长度为20各字符。如果我们试图给某个ProductsDataRow的QuantityPerUnit属性设置一个长度大于20个字符的字符串,将会有一个ArgumentException被抛出。
图四:DataColumn提供了基本的字段级验证
不幸的是,我们不能通过属性窗口指定一个边界检查,比如UnitPrice的值不能小于0。为了提供这样的字段级验证,我们需要为DataTable的ColumnChanging事件建立一个Event Handler。正如上一节教程中所提到的那样,由类型化数据集创建的DataSet、DataTable还有DataRow对象可以通过partial类来进行扩展。使用这个技术,我们可以为ProductDataTable创建一个ColumnChanging的Event Handler。我们先在App_Code文件夹中新建一个名为ProductsDataTable.ColumnChanging.cs的类文件,如下图所示。
图五:在App_Code文件夹中添加新类
然后,给ColumnChanging事件创建一个Event handler,以保证UnitPrice、UnitsInStock、UnitsOnOrder以及ReorderLevel字段的值不小于0。如果这些列的值超出范围就抛出一个ArgumentException。
1public partial class Northwind
2{
3 public partial class ProductsDataTable
4 {
5 public override void BeginInit()
6 {
7 this.ColumnChanging += ValidateColumn;
8 }
9
10 void ValidateColumn(object sender, DataColumnChangeEventArgs e)
11 {
12 if(e.Column.Equals(this.UnitPriceColumn))
13 {
14 if(!Convert.IsDBNull(e.ProposedValue) && (decimal)e.ProposedValue < 0)
15 {
16 throw new ArgumentException("UnitPrice cannot be less than zero", "UnitPrice");
17 }
18 }
19 else if (e.Column.Equals(this.UnitsInStockColumn) ||
20 e.Column.Equals(this.UnitsOnOrderColumn) ||
21 e.Column.Equals(this.ReorderLevelColumn))
22 {
23 if (!Convert.IsDBNull(e.ProposedValue) && (short)e.ProposedValue < 0)
24 {
25 throw new ArgumentException(string.Format("{0} cannot be less than zero", e.Column.ColumnName), e.Column.ColumnName);
26 }
27 }
28 }
29 }
30}