声明性参数 (VB)

作者 :Scott Mitchell

下载 PDF

在本教程中,我们将演示如何使用设置为硬编码值的参数来选择要显示在 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.aspxBasicReporting。 从 DetailsView 的智能标记中,从下拉列表中选择“新建数据源>”<,然后选择添加 ObjectDataSource。

将 ObjectDataSource 添加到页面

图 1:将 ObjectDataSource 添加到 Page (单击以查看全尺寸图像)

这将自动启动 ObjectDataSource 控件的“选择数据源”向导。 ProductsBLL从向导的第一个屏幕中选择类。

选择 ProductsBLL 类

图 2:选择 ProductsBLL 类 (单击以查看全尺寸图像)

由于我们想要显示有关特定产品的信息, GetProductByProductID(productID) 因此需要使用 方法。

选择 getProductByProductID (productID) 方法

图 3:选择 GetProductByProductID(productID) 方法 (单击以查看全尺寸图像)

由于所选方法包含参数,因此向导还有一个屏幕,要求我们定义要用于参数的值。 左侧列表显示所选方法的所有参数。 对于 GetProductByProductID(productID) ,只有一个 productID。 在右侧,我们可以指定所选参数的值。 参数源下拉列表枚举参数值的各种可能源。 由于我们要为 productID 参数指定硬编码值 5,因此请将“参数源”保留为“无”,并在“DefaultValue”文本框中输入 5。

Hard-Coded 参数值 5 将用于 productID 参数

图 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>

注意

如果在自己的计算机上执行操作,此时看到的声明性标记可能包括 、 UpdateMethodDeleteMethod 属性的值InsertMethod以及 DeleteParameters。 ObjectDataSource 的“选择数据源”向导自动指定要用于插入、更新和删除的方法 ProductBLL ,因此,除非明确清除了这些方法,否则它们将包含在上述标记中。

访问此页时,数据 Web 控件将调用 ObjectDataSource 的 Select 方法,该方法将使用输入参数的硬编码值 5 调用 ProductsBLLGetProductByProductID(productID)productID 方法。 方法将返回一个强类型 ProductDataTable 对象,该对象包含一行,其中包含有关 Chef Anton's Gumbo Mix 的信息, (具有 ProductID 5 个) 的产品。

显示有关厨师安东的甘博混合的信息

图 5:显示有关 Chef Anton 的 Gumbo Mix 的信息 (单击以查看全尺寸图像)

将参数值设置为 Web 控件的属性值

ObjectDataSource 的参数值也可以基于页面上 Web 控件的值进行设置。 为了说明这一点,让我们创建一个 GridView,其中列出了位于用户指定的国家/地区的所有供应商。 为此,请先将 TextBox 添加到用户可以在其中输入国家/地区名称的页面。 将此 TextBox 控件的 ID 属性设置为 CountryName。 此外,添加按钮 Web 控件。

将 TextBox 添加到 ID 为 CountryName 的页面

图 6:使用“单击”查看全尺寸图像 (向页面IDCountryName添加 TextBox)

接下来,将 GridView 添加到页面,并从智能标记中选择添加新的 ObjectDataSource。 由于我们想要显示供应商信息, SuppliersBLL 因此请从向导的第一个屏幕中选择类。 从第二个屏幕中 GetSuppliersByCountry(country) ,选取 方法。

选择 GetSuppliersByCountry (country) 方法

图 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 调用,但 值 Nothing 将传递到方法中 GetSuppliersByCountry(country) 。 TableAdapter 将 转换为 Nothing) (DBNull.Value 数据库NULL值,但编写方法使用的GetSuppliersByCountry(country)查询,以便在为 @CategoryID 参数指定值NULL时不返回任何值。 简言之,不返回任何供应商。

但是,一旦访问者进入某个国家/地区,并单击“显示供应商”按钮进行回发,将重新查询 ObjectDataSource 的 Select 方法,并将 TextBox 控件 Text 的值作为 country 参数传递。

显示来自加拿大的供应商

图 9:显示来自加拿大的供应商 (单击以查看全尺寸图像)

默认显示所有供应商

我们不想在首次查看页面时显示任何供应商,而是首先显示 所有 供应商,从而允许用户通过在 TextBox 中输入国家/地区名称来缩减列表。 当 TextBox 为空时,将SuppliersBLL为其输入参数传入Nothingcountry类的 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放置一行。