宣告式參數 (VB)
在本教學課程中,我們將說明如何使用參數設定為硬式編碼值,以選取要顯示在 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。
圖 1:將 ObjectDataSource 新增至 Page (Click 以檢視完整大小的影像)
這會自動啟動 ObjectDataSource 控件的 [選擇數據源精靈]。 從精 ProductsBLL
靈的第一個畫面中選取 類別。
圖 2:選取類別 ProductsBLL
(按鍵即可檢視完整大小的影像)
因為我們想要顯示特定產品的相關信息,所以我們想要使用 GetProductByProductID(productID)
方法。
圖 3:選擇 GetProductByProductID(productID)
方法 (按下即可檢視完整大小的影像)
由於我們選取的方法包含參數,因此精靈會再顯示一個畫面,因此系統會要求我們定義要用於參數的值。 左側清單會顯示所選方法的所有參數。 只有 GetProductByProductID(productID)
一個 productID
。 在右側,我們可以指定所選參數的值。 參數來源下拉式清單會列舉參數值的各種可能來源。 由於我們想要為參數指定硬式編碼值 5 productID
,請將 [參數來源] 保留為 [無],然後在 [DefaultValue] 文本框中輸入 5。
圖 4:Hard-Coded 參數值 5 將用於 productID
參數 (按鍵即可檢視完整大小的影像)
完成 [設定數據源精靈] 之後,ObjectDataSource 控件的宣告式標記會針對 屬性中所定義方法所預期的每個輸入參數,在 Parameter
集合中包含 SelectParameters
SelectMethod
物件。 由於我們在此範例中使用的方法只需要單一輸入參數, 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
,以及 DeleteParameters
DeleteMethod
UpdateMethod
ObjectDataSource 的 [選擇數據源] 精靈會自動指定要用於插入、更新和刪除的 方法,因此除非您明確清除這些方法 ProductBLL
,否則它們會包含在上述標記中。
流覽此頁面時,數據 Web 控件會叫用 ObjectDataSource 的 Select
方法,這會使用productID
輸入參數的硬式編碼值為 5 來呼叫 ProductsBLL
類別的 GetProductByProductID(productID)
方法。 方法會傳回強型別 ProductDataTable
物件,其中包含單一數據列,其中包含 Chef Anton's一個 (含 5 個) 的產品 ProductID
相關信息。
圖 5:在 按兩下以檢視全大小影像) 時,會顯示 Chef Anton 的[設定混合] 相關信息 (
將參數值設定為 Web 控制件的屬性值
您也可以根據頁面上 Web 控件的值來設定 ObjectDataSource 的參數值。 為了說明這一點,讓我們有一個 GridView,其中列出所有位於使用者所指定國家/地區的供應商。 若要完成此作業,請先將 TextBox 新增至使用者可以在其中輸入國家/地區名稱的頁面。 將此 TextBox 控制件的 ID
屬性設定為 CountryName
。 同時新增 Button Web 控制件。
圖 6:將 TextBox 新增至具有 ID
CountryName
(按兩下以檢視完整大小的影像)
接下來,將 GridView 新增至頁面,然後從智慧標記選擇新增 ObjectDataSource。 因為我們想要顯示供應商資訊,請從精靈的第一個畫面中選取 SuppliersBLL
類別。 從第二個畫面中,挑選 GetSuppliersByCountry(country)
方法。
圖 7:選擇 GetSuppliersByCountry(country)
方法 (按鍵即可檢視完整大小的影像)
GetSuppliersByCountry(country)
由於方法具有輸入參數,因此精靈會再次包含選擇參數值的最終畫面。 這次,將 [參數來源] 設定為 [控制]。 這會在頁面上填入控件名稱的ControlID下拉式清單; CountryName
從清單中選取控件。 第一次瀏覽 CountryName
頁面時,TextBox 會是空白的,因此不會傳回任何結果,也不會顯示任何結果。 如果您想要預設顯示某些結果,請據以設定DefaultValue 文字框。
圖 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 叫用,但 的值 Nothing
會傳遞至 GetSuppliersByCountry(country)
方法。 TableAdapter 會將 Nothing
轉換成資料庫NULL
值 (DBNull.Value
) ,但是會寫入 方法所使用的GetSuppliersByCountry(country)
查詢,如此一來,當為 @CategoryID
參數指定值時NULL
,它就不會傳回任何值。 簡單地說,不會傳回任何供應商。
不過,一旦訪客進入國家/地區,然後按兩下 [顯示供貨商] 按鈕以產生回傳,就會重新查詢 ObjectDataSource 的 Select
方法,並傳入 TextBox 控件 Text
的值做為 country
參數。
圖 9:加拿大的供貨商顯示 (按兩下即可檢視完整大小的影像)
默認顯示所有供應商
我們不會在第一次檢視頁面時顯示任何供應商,而是要在第一次顯示 所有 供應商,讓使用者在 TextBox 中輸入國家 / 地區名稱來剖析清單。 當 TextBox 是空的時,SuppliersBLL
會針對其country
輸入參數傳入 Nothing
類別的 GetSuppliersByCountry(country)
方法。 此值 Nothing
接著會向下傳遞至 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)
方法,以在其國家/地區參數為 Nothing
時叫GetSuppliers()
用 方法,否則呼叫 DAL 的方法GetSuppliersByCountry(country)
。 當未指定國家/地區時傳回所有供應商,並在包含國家/地區參數時傳回適當的供應商子集時,這會有效果。
將 GetSuppliersByCountry(country)
類別中的 SuppliersBLL
方法變更為下列專案:
Public Function GetSuppliersByCountry(country As String) _
As Northwind.SuppliersDataTable
If String.IsNullOrEmpty(country) Then
Return GetSuppliers()
Else
Return Adapter.GetSuppliersByCountry(country)
End If
End Function
有了這項變更, 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。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應