宣告式參數 (C#)

作者 :Scott Mitchell

下載 PDF

在本教學課程中,我們將說明如何使用參數設定為硬式編碼值,以選取要顯示在 DetailsView 控件中的數據。

簡介

上一個教學課程中,我們探討如何使用系結至 ObjectDataSource 控件的 GridView、DetailsView 和 FormView 控件來顯示數據,該控件會從 ProductsBLL 類別叫GetProducts()用 方法。 方法會 GetProducts() 傳回強型別 DataTable,其中填入 Northwind 資料庫 Products 數據表中的所有記錄。 類別 ProductsBLL 包含其他方法,只傳回產品子集 - GetProductByProductID(productID)GetProductsByCategoryID(categoryID)GetProductsBySupplierID(supplierID)。 這三種方法需要輸入參數,指出如何篩選傳回的產品資訊。

ObjectDataSource 可用來叫用預期輸入參數的方法,但為了這樣做,我們必須指定這些參數的值來自何處。 參數值可以是硬式編碼,也可以來自各種動態來源,包括:querystring 值、會話變數、頁面上 Web 控件的屬性值,或其他。

在本教學課程中,讓我們從說明如何使用參數集為硬式編碼值開始。 具體來說,我們將探討如何將DetailsView新增至頁面,以顯示特定產品的相關信息,也就是 Chef Anton 的一個 ProductID 一個包含5個的一個。 接下來,我們將瞭解如何根據 Web 控件設定參數值。 特別是,我們將使用 TextBox 讓使用者輸入國家/地區,之後他們可以按下按鈕來查看位於該國家/地區的供應商清單。

使用 Hard-Coded 參數值

在第一個範例中,首先將 DetailsView 控件新增至 DeclarativeParams.aspx 資料夾中的頁面 BasicReporting 。 從 DetailsView 的智慧標記中,從下拉式清單中選取 <[新增數據源> ],然後選擇新增 ObjectDataSource。

將 ObjectDataSource 新增至頁面

圖 1:將 ObjectDataSource 新增至 Page (Click 以檢視完整大小的影像)

這會自動啟動 ObjectDataSource 控件的 [選擇數據源精靈]。 從精 ProductsBLL 靈的第一個畫面中選取 類別。

選取 ProductsBLL 類別

圖 2:選取類別 ProductsBLL (按鍵即可檢視完整大小的影像)

因為我們想要顯示特定產品的相關信息,所以我們想要使用 GetProductByProductID(productID) 方法。

選擇 GetProductByProductID (productID) 方法

圖 3:選擇 GetProductByProductID(productID) 方法 (按下即可檢視完整大小的影像)

由於我們選取的方法包含參數,因此精靈會再顯示一個畫面,因此系統會要求我們定義要用於參數的值。 左側清單會顯示所選方法的所有參數。 只有 GetProductByProductID(productID) 一個 productID。 在右側,我們可以指定所選參數的值。 參數來源下拉式清單會列舉參數值的各種可能來源。 由於我們想要為參數指定硬式編碼值 5 productID ,請將 [參數來源] 保留為 [無],然後在 [DefaultValue] 文本框中輸入 5。

Hard-Coded 參數值 5 將用於 productID 參數

圖 4:Hard-Coded 參數值 5 將用於 productID 參數 (按鍵即可檢視完整大小的影像)

完成 [設定數據源精靈] 之後,ObjectDataSource 控件的宣告式標記會針對 屬性中所定義方法所預期的每個輸入參數,在 Parameter 集合中包含 SelectParametersSelectMethod 物件。 由於我們在此範例中使用的方法只需要單一輸入參數, parameterID因此這裡只有一個專案。 SelectParameters集合可以包含衍生自 Parameter 命名空間中 System.Web.UI.WebControls 類別的任何類別。 如果是硬式編碼的參數值,則會使用基 Parameter 類,但針對其他參數來源選項,則會使用衍生 Parameter 類別;您也可以視需要建立自己的 自定義參數類型

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="GetProductByProductID" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:Parameter DefaultValue="5" Name="productID"
         Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

注意

如果您在自己的電腦上追蹤,此時看到的宣告式標記可能包含、 和屬性的值InsertMethod,以及 DeleteParametersDeleteMethodUpdateMethod ObjectDataSource 的 [選擇數據源] 精靈會自動指定要用於插入、更新和刪除的 方法,因此除非您明確清除這些方法 ProductBLL ,否則它們會包含在上述標記中。

流覽此頁面時,數據 Web 控件會叫用 ObjectDataSource 的 Select 方法,這會使用productID輸入參數的硬式編碼值為 5 來呼叫 ProductsBLL 類別的 GetProductByProductID(productID) 方法。 方法會傳回強型別 ProductDataTable 物件,其中包含單一數據列,其中包含 Chef Anton's一個 (含 5 個) 的產品 ProductID 相關信息。

隨即顯示 Chef Anton 的一個一元混合相關信息

圖 5:在 按兩下以檢視全大小影像) 時,會顯示 Chef Anton 的[設定混合] 相關信息 (

將參數值設定為 Web 控制件的屬性值

您也可以根據頁面上 Web 控件的值來設定 ObjectDataSource 的參數值。 為了說明這一點,讓我們有一個 GridView,其中列出所有位於使用者所指定國家/地區的供應商。 若要完成此作業,請先將 TextBox 新增至使用者可以在其中輸入國家/地區名稱的頁面。 將此 TextBox 控制件的 ID 屬性設定為 CountryName。 同時新增 Button Web 控制件。

使用ID CountryName 將 TextBox 新增至頁面

圖 6:將 TextBox 新增至具有 IDCountryName (按兩下以檢視完整大小的影像)

接下來,將 GridView 新增至頁面,然後從智慧標記選擇新增 ObjectDataSource。 因為我們想要顯示供應商資訊,請從精靈的第一個畫面中選取 SuppliersBLL 類別。 從第二個畫面中,挑選 GetSuppliersByCountry(country) 方法。

選擇 GetSuppliersByCountry (國家/地區) 方法

圖 7:選擇 GetSuppliersByCountry(country) 方法 (按鍵即可檢視完整大小的影像)

GetSuppliersByCountry(country)由於方法具有輸入參數,因此精靈會再次包含選擇參數值的最終畫面。 這次,將 [參數來源] 設定為 [控制]。 這會在頁面上填入控件名稱的ControlID下拉式清單; CountryName 從清單中選取控件。 第一次瀏覽 CountryName 頁面時,TextBox 會是空白的,因此不會傳回任何結果,也不會顯示任何結果。 如果您想要預設顯示某些結果,請據以設定DefaultValue 文字框。

將參數值設定為 CountryName 控制項值

圖 8:將 [參數值] 設定為 CountryName [控件值] (按兩下即可檢視完整大小的影像)

ObjectDataSource 的宣告式標記與第一個範例稍有不同,使用 ControlParameter 而不是標準 Parameter 物件。 ControlParameter具有其他屬性,可用來指定 ID Web 控制件的 ,以及要用於參數 (PropertyName) 的屬性值。 [設定數據源精靈] 已足夠聰明,可判斷 TextBox 可能想要針對參數值使用 Text 屬性。 不過,如果您想要使用與 Web 控制項不同的屬性值,您可以在這裡變更 PropertyName 值,或按兩下精靈中的 [顯示進階屬性] 連結。

<asp:ObjectDataSource ID="ObjectDataSource2" runat="server"
    SelectMethod="GetSuppliersByCountry" TypeName="SuppliersBLL">
    <SelectParameters>
        <asp:ControlParameter ControlID="CountryName"
          Name="country" PropertyName="Text"
            Type="String" />
    </SelectParameters>
</asp:ObjectDataSource>

第一次 CountryName 瀏覽頁面時,TextBox 是空的。 ObjectDataSource 的 Select 方法仍由 GridView 叫用,但 的值 null 會傳遞至 GetSuppliersByCountry(country) 方法。 TableAdapter 會將 null 轉換成資料庫NULL值 (DBNull.Value) ,但是會寫入 方法所使用的GetSuppliersByCountry(country)查詢,如此一來,當為 @CategoryID 參數指定值時NULL,它就不會傳回任何值。 簡單地說,不會傳回任何供應商。

不過,一旦訪客進入國家/地區,然後按兩下 [顯示供貨商] 按鈕以產生回傳,就會重新查詢 ObjectDataSource 的 Select 方法,並傳入 TextBox 控件 Text 的值做為 country 參數。

顯示來自加拿大的供應商

圖 9:加拿大的供貨商顯示 (按兩下即可檢視完整大小的影像)

默認顯示所有供應商

我們不會在第一次檢視頁面時顯示任何供應商,而是要在第一次顯示 所有 供應商,讓使用者在 TextBox 中輸入國家 / 地區名稱來剖析清單。 當 TextBox 是空的時, SuppliersBLL 類別的 GetSuppliersByCountry(country) 方法會傳入 nullcountry 輸入參數的值。 此值 null 接著會向下傳遞至 DAL 的 GetSupplierByCountry(country) 方法,其會轉譯為下列查詢中 參數的資料庫 NULL@Country

SELECT     SupplierID, CompanyName, Address, City, Country, Phone
FROM         Suppliers
WHERE Country = @Country

表達式 Country = NULL 一律會傳回 False,即使是數據 Country 行具有 NULL 值的記錄,也不會傳回任何記錄。

若要在國家/地區 TextBox 是空的時傳回所有供應商,我們可以在 BLL 中增強 GetSuppliersByCountry(country) 方法,以在其國家/地區參數為 null 時叫GetSuppliers()用 方法,否則呼叫 DAL 的方法GetSuppliersByCountry(country)。 當未指定國家/地區時傳回所有供應商,並在包含國家/地區參數時傳回適當的供應商子集時,這會有效果。

GetSuppliersByCountry(country) 類別中的 SuppliersBLL 方法變更為下列專案:

public Northwind.SuppliersDataTable GetSuppliersByCountry(string country)
{
    if (string.IsNullOrEmpty(country))
        return GetSuppliers();
    else
        return Adapter.GetSuppliersByCountry(country);
}

有了這項變更, DeclarativeParams.aspx 當第一次流覽 (或每當 CountryName TextBox 是空的) 時,頁面會顯示所有供應商。

默認會顯示所有供應商

圖 10:預設會顯示所有供應商, (按兩下即可檢視完整大小的影像)

摘要

若要搭配輸入參數使用方法,我們必須在 ObjectDataSource 的 SelectParameters 集合中指定參數的值。 不同類型的參數允許從不同的來源取得參數值。 默認參數類型會使用硬式編碼值,但就像輕鬆地 (,而且不需要程式代碼行,) 參數值可以從頁面上的查詢字串、會話變數、Cookie,甚至是使用者輸入的值取得。

本教學課程中所探討的範例說明如何使用宣告式參數值。 不過,有時可能需要使用無法使用的參數來源,例如目前的日期和時間,或者,如果我們的網站使用成員資格,則訪客的使用者標識符。 在這種情況下,我們可以在 ObjectDataSource 叫用其基礎物件的 方法之前,以程式設計方式設定參數值。 我們將在 下一個教學課程中瞭解如何完成此作業。

快樂的程序設計!

關於作者

Scott Mitchell 是 1998 年以來,1998 年與 Microsoft Web 技術合作的 篇 ASP/ASP.NET 書籍和 4GuysFromRolla.com 作者。 Scott 是獨立的顧問、訓練者和作者。 他的最新書籍是 Sams 在 24 小時內自行 ASP.NET 2.0。 您可以透過mitchell@4GuysFromRolla.com部落格連到,也可以透過其部落格來存取,網址為 http://ScottOnWriting.NET

特別感謝

本教學課程系列是由許多實用的檢閱者所檢閱。 本教學課程的首席檢閱者是「新式 Giesenow」。 想要檢閱即將推出的 MSDN 文章嗎? 如果是,請將一行放在 mitchell@4GuysFromRolla.com。