声明性参数 (VB)
在本教程中,我们将演示如何使用设置为硬编码值的参数来选择要显示在 DetailsView 控件中的数据。
简介
在上一教程中,我们了解了如何使用 GridView、DetailsView 和 FormView 控件来显示绑定到从 ProductsBLL
类调用 GetProducts()
方法的 ObjectDataSource 控件的数据。 方法 GetProducts()
返回使用 Northwind 数据库 Products
表中的所有记录填充的强类型 DataTable。 类 ProductsBLL
包含其他方法,用于仅返回产品的子集 - GetProductByProductID(productID)
、 GetProductsByCategoryID(categoryID)
和 GetProductsBySupplierID(supplierID)
。 这三种方法需要一个输入参数,指示如何筛选返回的产品信息。
ObjectDataSource 可用于调用需要输入参数的方法,但为此,我们必须指定这些参数的值来自何处。 参数值可以是硬编码的,也可以来自各种动态源,包括:查询字符串值、会话变量、页面上 Web 控件的属性值等。
本教程首先说明如何使用设置为硬编码值的参数。 具体而言,我们将介绍如何将 DetailsView 添加到显示特定产品相关信息的页面,即 Chef Anton's Gumbo Mix,其的 为 ProductID
5。 接下来,我们将了解如何基于 Web 控件设置参数值。 具体而言,我们将使用 TextBox 让用户在某个国家/地区键入内容,之后他们可以单击“按钮”以查看驻留在该国家/地区的供应商列表。
使用 Hard-Coded 参数值
对于第一个示例,首先将 DetailsView 控件添加到 文件夹中的页面DeclarativeParams.aspx
BasicReporting
。 从 DetailsView 的智能标记中,从下拉列表中选择“新建数据源>”<,然后选择添加 ObjectDataSource。
图 1:将 ObjectDataSource 添加到 Page (单击以查看全尺寸图像)
这将自动启动 ObjectDataSource 控件的“选择数据源”向导。 ProductsBLL
从向导的第一个屏幕中选择类。
图 2:选择 ProductsBLL
类 (单击以查看全尺寸图像)
由于我们想要显示有关特定产品的信息, GetProductByProductID(productID)
因此需要使用 方法。
图 3:选择 GetProductByProductID(productID)
方法 (单击以查看全尺寸图像)
由于所选方法包含参数,因此向导还有一个屏幕,要求我们定义要用于参数的值。 左侧列表显示所选方法的所有参数。 对于 GetProductByProductID(productID)
,只有一个 productID
。 在右侧,我们可以指定所选参数的值。 参数源下拉列表枚举参数值的各种可能源。 由于我们要为 productID
参数指定硬编码值 5,因此请将“参数源”保留为“无”,并在“DefaultValue”文本框中输入 5。
图 4:Hard-Coded 参数值 5 将用于 productID
参数 (单击以查看全尺寸图像)
完成“配置数据源”向导后,ObjectDataSource 控件的声明性标记在 集合中包含SelectParameters
一个 Parameter
对象,该对象用于属性中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>
注意
如果在自己的计算机上执行操作,此时看到的声明性标记可能包括 、 UpdateMethod
和 DeleteMethod
属性的值InsertMethod
以及 DeleteParameters
。 ObjectDataSource 的“选择数据源”向导自动指定要用于插入、更新和删除的方法 ProductBLL
,因此,除非明确清除了这些方法,否则它们将包含在上述标记中。
访问此页时,数据 Web 控件将调用 ObjectDataSource 的 Select
方法,该方法将使用输入参数的硬编码值 5 调用 ProductsBLL
类 GetProductByProductID(productID)
的 productID
方法。 方法将返回一个强类型 ProductDataTable
对象,该对象包含一行,其中包含有关 Chef Anton's Gumbo Mix 的信息, (具有 ProductID
5 个) 的产品。
图 5:显示有关 Chef Anton 的 Gumbo Mix 的信息 (单击以查看全尺寸图像)
将参数值设置为 Web 控件的属性值
ObjectDataSource 的参数值也可以基于页面上 Web 控件的值进行设置。 为了说明这一点,让我们创建一个 GridView,其中列出了位于用户指定的国家/地区的所有供应商。 为此,请先将 TextBox 添加到用户可以在其中输入国家/地区名称的页面。 将此 TextBox 控件的 ID
属性设置为 CountryName
。 此外,添加按钮 Web 控件。
图 6:使用“单击”查看全尺寸图像 (向页面ID
CountryName
添加 TextBox)
接下来,将 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
) (DBNull.Value
数据库NULL
值,但编写方法使用的GetSuppliersByCountry(country)
查询,以便在为 @CategoryID
参数指定值NULL
时不返回任何值。 简言之,不返回任何供应商。
但是,一旦访问者进入某个国家/地区,并单击“显示供应商”按钮进行回发,将重新查询 ObjectDataSource 的 Select
方法,并将 TextBox 控件 Text
的值作为 country
参数传递。
图 9:显示来自加拿大的供应商 (单击以查看全尺寸图像)
默认显示所有供应商
我们不想在首次查看页面时显示任何供应商,而是首先显示 所有 供应商,从而允许用户通过在 TextBox 中输入国家/地区名称来缩减列表。 当 TextBox 为空时,将SuppliersBLL
为其输入参数传入Nothing
country
类的 GetSuppliersByCountry(country)
方法。 然后,此值 Nothing
向下传递到 DAL 的 GetSupplierByCountry(country)
方法,在该方法中,它将转换为以下查询中 参数的数据库 NULL
值 @Country
:
SELECT SupplierID, CompanyName, Address, City, Country, Phone
FROM Suppliers
WHERE Country = @Country
即使对于列具有NULL
值的记录Country
,表达式Country = NULL
也始终返回 False;因此,不会返回任何记录。
若要在国家/地区 TextBox 为空时返回所有供应商,我们可以扩充 GetSuppliersByCountry(country)
BLL 中的 方法,以在其国家/地区参数为 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
当首次访问 (或 TextBox 为空) 时 CountryName
,页面会显示所有供应商。
图 10:现在默认显示所有供应商 (单击以查看全尺寸图像)
总结
若要将方法与输入参数一起使用,我们需要为 ObjectDataSource 集合 SelectParameters
中的参数指定值。 不同类型的参数允许从不同的源获取参数值。 默认参数类型使用硬编码值,但同样容易地 (,无需代码) 参数值可以从页面上的 Web 控件的 querystring、会话变量、Cookie 甚至用户输入的值获取。
我们在本教程中查看的示例演示了如何使用声明性参数值。 但是,有时我们可能需要使用不可用的参数源,例如当前日期和时间,或者,如果我们的网站使用的是成员资格,则为访问者的用户 ID。 对于这种情况,我们可以在 ObjectDataSource 调用其基础对象的 方法之前以编程方式设置参数值。 我们将在 下一教程中了解如何完成此操作。
编程快乐!
关于作者
斯科特·米切尔是七本 ASP/ASP.NET 书籍的作者和 4GuysFromRolla.com 的创始人,自 1998 年以来一直在使用 Microsoft Web 技术。 Scott 担任独立顾问、培训师和作家。 他的最新一本书是 山姆斯在 24 小时内 ASP.NET 2.0。 可以在 上mitchell@4GuysFromRolla.com联系他,也可以通过他的博客(可在 中找到http://ScottOnWriting.NET)。
特别感谢
本教程系列由许多有用的审阅者审阅。 本教程的首席审阅者是希尔顿·吉森诺。 有兴趣查看我即将发布的 MSDN 文章? 如果是,请在 处mitchell@4GuysFromRolla.com放置一行。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈