声明性参数 (C#)

作者 :斯科特·米切尔

下载 PDF

在本教程中,我们将演示如何使用参数集来硬编码值来选择要在 DetailsView 控件中显示的数据。

介绍

上一个教程中,我们介绍了如何使用绑定到从ProductsBLL类调用GetProducts()该方法的 ObjectDataSource 控件的 GridView、DetailsView 和 FormView 控件显示数据。 该方法 GetProducts() 返回一个强类型数据表,其中包含 Northwind 数据库 Products 表中的所有记录。 该ProductsBLL类包含用于仅返回产品子集的其他方法 ,GetProductByProductID(productID)GetProductsByCategoryID(categoryID)以及GetProductsBySupplierID(supplierID)。 这三种方法需要一个输入参数,指示如何筛选返回的产品信息。

ObjectDataSource 可用于调用需要输入参数的方法,但为此,我们必须指定这些参数的值来自何处。 参数值可以是硬编码的,也可以来自各种动态源,包括:查询字符串值、会话变量、页面上 Web 控件的属性值或其他控件。

本教程首先介绍如何使用参数集来硬编码值。 具体而言,我们将介绍如何将 DetailsView 添加到显示有关特定产品的信息的页面,即 Chef Anton 的 Gumbo Mix,该组合包含 ProductID 5 个。 接下来,我们将了解如何基于 Web 控件设置参数值。 具体而言,我们将使用 TextBox 让用户在国家/地区键入,然后他们可以单击按钮以查看驻留在该国家/地区的供应商列表。

使用硬编码参数值

对于第一个示例,首先将 DetailsView 控件添加到 DeclarativeParams.aspx 文件夹中的页面 BasicReporting 。 从 DetailsView 的智能标记中,从下拉列表中选择 <“新建数据源> ”,然后选择添加 ObjectDataSource。

将 ObjectDataSource 添加到页面

图 1:将 ObjectDataSource 添加到页面(单击可查看全尺寸图像

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

选择 ProductsBLL 类

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

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

选择 GetProductByProductID(productID) 方法

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

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

硬编码参数值 5 将用于 productID 参数

图 4:将用于 productID 参数的硬编码参数值 5(单击以查看全尺寸图像

完成“配置数据源”向导后,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>

注意

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

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

显示有关 Chef Anton 的甘博混合的信息

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

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

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

将 TextBox 添加到 ID CountryName 的页面

图 6:向页面添加 TextBox(ID CountryName 单击可查看全尺寸图像)

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

选择 GetSuppliersByCountry(country) 方法

图 7:选择 GetSuppliersByCountry(country) 方法(单击以查看全尺寸图像

GetSuppliersByCountry(country)由于该方法具有输入参数,向导再次包含用于选择参数值的最终屏幕。 这一次,将参数源设置为“控制”。 这将使用页面上控件的名称填充 ControlID 下拉列表; CountryName 从列表中选择控件。 首次访问页面时, CountryName TextBox 将为空,因此不会返回任何结果,并且不显示任何结果。 如果要默认显示某些结果,请相应地设置 DefaultValue 文本框。

将参数值设置为 CountryName 控件值

图 8:将参数值设置为 CountryName 控件值(单击可查看全尺寸图像

ObjectDataSource 的声明性标记与使用 ControlParameter 而不是标准Parameter对象的第一个示例略有不同。 A 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 调用,但值 nullGetSuppliersByCountry(country) 传递到该方法中。 TableAdapter 将null转换为数据库NULL值(DBNull.Value),但该方法使用的GetSuppliersByCountry(country)查询被写入,以便在为@CategoryID参数指定值时NULL不返回任何值。 简言之,没有供应商返回。

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

显示来自加拿大的供应商

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

默认显示所有供应商

在首次查看页面时,建议先显示所有供应商,而不是显示任何供应商,这样用户就可以通过在 TextBox 中输入国家/地区名称来分析列表。 当 TextBox 为空时,类SuppliersBLLGetSuppliersByCountry(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 为空时返回所有供应商,我们可以扩充 GetSuppliersByCountry(country) BLL 中的方法,以在其国家/地区参数为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 集合中参数的值。 不同类型的参数允许从不同的源获取参数值。 默认参数类型使用硬编码值,但从页面上的 Web 控件获取查询字符串、会话变量、Cookie 甚至用户输入的值同样简单(且没有代码行)。

本教程中介绍的示例演示了如何使用声明性参数值。 但是,有时我们需要使用不可用的参数源,例如当前日期和时间,或者,如果网站正在使用成员身份,则访问者的用户 ID。 在这种情况下,我们可以在调用其基础对象的方法之前以编程方式设置参数值。 我们将在下一教程了解如何完成此操作。

快乐编程!

关于作者

斯科特·米切尔,七本 ASP/ASP.NET 书籍的作者和 4GuysFromRolla.com创始人,自1998年以来一直在与Microsoft Web 技术合作。 斯科特担任独立顾问、教练和作家。 他的最新书是 山姆斯在24小时内 ASP.NET 2.0。 他可以通过他的博客联系到mitchell@4GuysFromRolla.com他,可以在该博客中找到http://ScottOnWriting.NET

特别感谢

本教程系列由许多有用的审阅者审阅。 本教程的主要审阅者是希尔顿·吉森诺。 有兴趣查看即将发布的 MSDN 文章? 如果是这样,请把我扔一条线。mitchell@4GuysFromRolla.com