在本教學課程中,我們將研究為 DAL 和 BLL 添加一個方法,該方法接受單一輸入參數並傳回資料。 此範例將以程式設計方式設定此參數。
簡介
正如我們在上一篇教學課程中所看到的,有許多選項可用於以宣告方式將參數值傳遞給 ObjectDataSource 的方法。 例如,如果參數值是硬編碼的、來自頁面上的 Web 控製或位於資料來源 Parameter 物件可讀的任何其他來源中,則可以將該值綁定到輸入參數,而無需編寫一行程式碼。
然而,有時參數值可能來自某個內建資料來源 Parameter 物件之一尚未考慮的來源。 如果我們的網站支援使用者帳戶,我們可能需要根據目前登入訪客的使用者 ID 設定參數。 或者,我們可能需要在將參數值傳送到 ObjectDataSource 的底層物件的方法之前對其進行自訂。
每當呼叫 ObjectDataSource 的 Select 方法時,ObjectDataSource 會先引發其 Selecting 事件。 然後呼叫 ObjectDataSource 的底層物件的方法。 一旦完成,ObjectDataSource 的 Selected 事件就會觸發 (圖 1 說明了這個事件序列)。 可以在 Selecting 事件的事件處理程序中設定或自訂傳遞到 ObjectDataSource 的基礎物件方法中的參數值。
ObjectDataSource 的 Selected 和 Selecting 事件在呼叫其底層物件的方法之前和之後觸發
圖 1:ObjectDataSource 和事件在呼叫其底層物件的方法 Selected 之前和 Selecting 之後觸發 (按一下查看全尺寸影像)
在本教學課程中,我們將著眼於向 DAL 和 BLL 添加一個方法,該方法接受單個輸入參數 (Month 類型 int) 並返回一個 EmployeesDataTable 物件,該物件填充有在指定的 Month 僱用週年紀念日的員工。 我們的範例將根據當前月份以程式設計方式設定此參數,顯示「本月員工週年紀念日」清單。
現在就開始吧!
第 1 步:新增一個方法至 EmployeesTableAdapter
對於我們的第一個範例,我們需要新增一種方法來檢索在指定月份發生 HireDate 的員工。 為了根據我們的架構提供此功能,我們需要先建立一個對應到 EmployeesTableAdapter 正確 SQL 陳述式的方法。 若要實現此目的,請先開啟 Northwind 類型資料集。 右鍵點擊 EmployeesTableAdapter 標籤並選擇新增查詢。
圖 2:新增 EmployeesTableAdapter 查詢 (點擊看大圖)
選擇新增返回行的 SQL 陳述式。 當您到達「指定陳述式」畫面時,SELECT預設陳述式SELECTEmployeesTableAdapter 將會載入。 只需新增 WHERE 子句:WHERE DATEPART(m, HireDate) = @Month。 DATEPART 是一個 T-SQL 函數,它會傳回 datetime 類型的特定日期部分;在本例中,我們使用 DATEPART 傳回 HireDate 列的月份。
圖 3:僅傳回 HireDate 列小於或等於 @HiredBeforeDate 參數的行 (按一下查看大圖)
最後,將 FillBy 和 GetDataBy 方法名稱分別改為 FillByHiredDateMonth 和 GetEmployeesByHiredDateMonth 。
選擇比 FillBy 和 GetDataBy 更合適的方法名稱
圖 4:選擇比 FillBy 和 GetDataBy 更合適的方法名稱 (點擊看大圖)
按一下「完成」完成精靈並返回資料集的設計介面。 現在 EmployeesTableAdapter 應該包括一套新的方法來訪問在指定月份僱用的員工。
圖 5:新方法出現在資料集的設計介面中 (點擊查看全尺寸影像)
步驟 2:將 GetEmployeesByHiredDateMonth(month) 方法新增至業務邏輯層
由於我們的應用程式架構對業務邏輯和資料存取邏輯使用單獨的層,因此我們需要向 BLL 添加一個方法,該方法向下調用 DAL 以檢索在指定日期之前僱用的員工。 開啟 EmployeesBLL.cs 檔案並新增以下方法:
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
public Northwind.EmployeesDataTable GetEmployeesByHiredDateMonth(int month)
{
return Adapter.GetEmployeesByHiredDateMonth(month);
}
與此類中的其他方法一樣,GetEmployeesByHiredDateMonth(month) 只需向下呼叫 DAL 並傳回結果即可。
步驟 3:顯示本月入職週年紀念日的員工
此範例的最後一步是顯示本月僱用週年紀念日的員工。 首先將 GridView 新增到 BasicReporting 資料夾中的 ProgrammaticParams.aspx 頁面,然後新增新的 ObjectDataSource 作為其資料來源。 配置 ObjectDataSource 以使用 SelectMethod 設定為 GetEmployeesByHiredDateMonth(month) 的EmployeesBLL 類別。
圖 6:使用 EmployeesBLL 類別 (點擊看大圖)
從 GetEmployeesByHiredDateMonth(month) 方法中選擇
圖 7:選擇 GetEmployeesByHiredDateMonth(month) 方法 (點擊看大圖)
最後一個畫面要求我們提供 month 參數值的來源。 由於我們將以程式設計方式設定此值,因此將參數來源設定保留為預留無選項,然後按一下完成。
圖 8:將 參數來源設為「無」(點選查看大圖)
這將在 ObjectDataSource 的 SelectParameters 集合中建立一個未指定值的 Parameter 物件。
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetEmployeesByHiredDateMonth" TypeName="EmployeesBLL">
<SelectParameters>
<asp:Parameter Name="month" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
要以程式設計方式設定此值,我們需要為 ObjectDataSource 的事件建立一個 Selecting 事件處理程序。 要完成此操作,請前往設計檢視並雙擊 ObjectDataSource。 或者,選擇 ObjectDataSource,前往「屬性」窗口,然後按一下閃電圖示。 接下來,雙擊事件旁邊的文字方塊或輸入要使用的 Selecting 事件處理程序的名稱。
按一下屬性視窗中的閃電圖示可列出 Web 控制項的事件
圖 9:按一下屬性視窗中的閃電圖示以列出 Web 控制項的事件
這兩種方法都會將 ObjectDataSource Selecting 事件的新事件處理程序新增至頁面的程式碼隱藏類別。 在此事件處理程序中,我們可以使用 e.InputParameters[parameterName] 讀取和寫入參數值,其中 parameterName 是 <asp:Parameter> 標記中 Name 屬性的值 (InputParameters集合也可以按順序索引,如 e.InputParameters[index] 中所示)。 若要將 month 參數設定為目前月份,請將以下內容新增至 Selecting 事件處理程序:
protected void ObjectDataSource1_Selecting
(object sender, ObjectDataSourceSelectingEventArgs e)
{
e.InputParameters["month"] = DateTime.Now.Month;
}
透過瀏覽器造訪此頁面時,我們可以看到本月 (3 月) 僅僱用了一名員工 Laura Callahan,她自 1994 年以來一直在該公司工作。
圖10:顯示本月週年紀念日的員工 (點擊可看大圖)
摘要
雖然 ObjectDataSource 的參數值通常可以以宣告方式設置,而不需要一行程式碼,但以程式設計方式設定參數值很容易。 我們需要做的就是為 ObjectDataSource 的 Selecting 事件建立一個事件處理程序,該處理程序在呼叫底層物件的方法之前觸發,並透過 InputParameters 集合手動設定一個或多個參數的值。
本教學課程結束了基本報告部分。 下一個教學課程從篩選和主詳細資訊場景部分開始,我們將介紹允許訪客篩選資料並從主報告深入詳細報告的技術。
祝您程式設計愉快!
關於作者
斯科特·米切爾,七本 ASP/ASP.NET 書籍和 4GuysFromRolla.com 創始人的作者,自1998年以來一直與Microsoft Web 技術合作。 Scott 擔任獨立顧問、講師和作家。 他的新書是 Sams Teach Yourself ASP.NET 2.0 in 24 Hours。 可以透過 mitchell@4GuysFromRolla.com 聯絡他。
特別感謝
本教學課程系列已經過許多熱心的檢閱者檢閱。 本教學課程的主要審閱者是 Hilton Giesenow。 有興趣檢閱我即將推出的 MSDN 文章嗎? 如果是,請在 mitchell@4GuysFromRolla.com給我留言。
為 EmployeesTableAdapter 新增查詢
僅傳回 HireDate 列小於或等於
新方法出現在資料集的設計介面中
使用 EmployeesBLL 類
將參數源設為無
本月顯示週年紀念的員工