使用分層架構 ASP.NET Web 應用處理資料,一般遵循步驟:
如前節所見,ObjectDataSource` 或資料 Web 伺服器控制項為步驟 1、3 提供擴充性。例 GridView` 控制項,觸發 RowUpdating` 事件前將欄位值指派至 ObjectDataSource` 的 UpdateParameters` 集合;ObjectDataSource` 完成操作後觸發 RowUpdated` 事件。
已檢測步驟 1 觸發事件並見如何實現自訂參數或取消操作。本節關注操作完成後觸發事件。透過後置事件處理器判斷操作過程是否產生例外並妥善處理,螢幕顯示友善錯誤訊息優於導向 ASP.NET 預設錯誤頁。
為說明後置事件運作,建立頁面:可編輯 GridView` 列出產品資訊。更新產品引發例外時,ASP.NET 頁面在 GridView` 上方顯示簡短訊息說明出現問題。開始實作!
建立僅含兩欄位 ProductName`、`UnitPrice` 的可編輯 GridView`。需為 ProductsBLL` 類別 UpdateProduct` 方法增加重載,僅接受 3 參數(產品名稱、單價、ID),相對於接受每個產品欄位方法。本節再練習建立可編輯 GridView` 顯示名稱、數量/單位、單價、庫存量,但僅允許名稱、單價、庫存量編輯。
需 UpdateProduct` 另一重載接受 4 參數:名稱、單價、庫存量、ID。在 ProductsBLL` 加入以下方法:
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, decimal? unitPrice, short? unitsInStock, int productID)
{
Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
if (products.Count == 0) return false;
Northwind.ProductsRow product = products[0];
product.ProductName = productName;
if (unitPrice == null) product.SetUnitPriceNull();
else product.UnitPrice = unitPrice.Value;
if (unitsInStock == null) product.SetUnitsInStockNull();
else product.UnitsInStock = unitsInStock.Value;
int rowsAffected = Adapter.Update(product);
return rowsAffected == 1;
}