使用 UpdateProduct 方法重载,它接受四个输入参数
这将创建一个 ObjectDataSource,它包含四个参数的 UpdateParameters 集合,还有一个 一个 GridView,它包含产品的每一个字段.ObjectDataSource 的声明标记给 OldValuesParameterFormatString 属性赋值为 original_{0},它将引发一个异常,因 为我们的 BLL 类没有一个名为 original_productID 的输入参数需要传入.别忘了从声明语 法里把这些设置通通删除(或者把它们设置为默认值:{0}). 然后,减少 GridView 的绑定列,仅包含 ProductName,QuantityPerUnit,UnitPrice 和 UnitsInStock 这几列. 随意设置一些你认为必要的字段级的格式 (例如更改 HeaderText 属性).
在之前的章节里我们已经看过了如何在只读和编辑两种模式下格式化 UnitPrice 绑定列为货 币格式.在这里我们同样这样做.这需要设置绑定列的 DataFormatString 属性为{0:c}, 它的 HtmlEncode 属性为 false,还有它的 ApplyFormatInEditMode 属性为 true,如图 2 所示.
图 2: UnitPrice 绑定列配置为显示一个货币金额
要在编辑界面将 UnitPrice 格式化为货币, 这需要为 GridView 的 RowUpdating 事件创建一 个事件处理,它将一个货币格式的字符串转换成 decimal.回想上一节,RowUpdating 事件 处理也用来检测并确保用户输入的是一个 UnitPrice 的值.不过,本节我们可以允许用户忽略 price 列. 1 protected void GridView1_RowUpdating(object sender, GridViewUpdateEventAr gs e) 2 3 4 { if (e.NewValues["UnitPrice"] != null) e.NewValues["UnitPrice"] =decimal.Parse(e.NewValues["UnitPrice"].ToStr
ing(), System.Globalization.NumberStyles.Currency); 5 }
6 7 我们的 GridView 包含一个 QuantityPerUnit 绑定列, 但它仅仅用作显示, 不能被用户编辑. 为了实现这一点,只需要简单地将该绑定列的 ReadOnly 属性设置为 true.
图 3: 设置 QuantityPerUnit 绑定列为只读
最后,从 GridView 的智能标记里勾选上"启用编辑".完成了这些步骤后, ErrorHandling.aspx 页面在
设计视图里将如图 4 所
示.
图 4: 删除除了必需的绑定列之外的其它列并启用编辑
在这里我们显示产品的所有列,ProductName,QuantityPerUnit,UnitPrice 和 UnitsInStock;不过仅仅 ProductName,UnitPrice 和 UnitsInStock 这几列可以编辑.
图 5: 用户现在可以很方便地编辑 Products' Names,Prices 和 Units In Stock 字段 ,
第二步:适当地处理 第二步 适当地处理 DAL 层异常
这时我们的可编辑的 GridView 在用户输入合法的 product's name,price 和 units in stock 时表现极佳,输入不合法的值时则导致一个异常.例如,遗漏了 ProductName 值则引发抛出
一个 NoNullAllowedException 异常, 因为 ProdcutsRow 类的 ProductName 属性设置了 它的 AllowDBNull 属性为 false;如果数据库不正常运作,则在试图连接数据库时通过 TableAdapter 抛出一个 SqlException 异常.没有任何的动作,这些异常都会从数据访问层 冒出到业务逻辑层,然后到 ASP.NET 页面,最后到 ASP.
NET 运行时. 取决于你的
web 应用程序如何配置以及是否从 localhost 访问该应用,一个未经处理的异常 会出现在一类服务器错误处理页,一个详细的错误报表,或者一个对用户友好的 web 页面.查 看 Web Application Error Handling in ASP.NET 和 customErrors Element 获得更多 的关于 ASP.NET 页面如何响应一个未捕获的异常的相关信息. 图 6 展示的是试图不指定 ProductName 的值更新一个产品时屏幕的状况.这显示的是通过 localhost 访问时的默认详细错误报表.
图 6: 省略 Product's Name 将显示异常明细
虽然这样的异常明细在我们测试应用程序的时候是很有用的, 然而当一个最终用户面对这样的异 常呈现时却是无所适从的. 一个最终用户很可能并不知道 NoNullAllowedException 是什么, 或者它是如何引起的. 更好的方法是呈