声明性参数 (C#)
作者 :斯科特·米切尔
在本教程中,我们将演示如何使用参数集来硬编码值来选择要在 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。
图 1:将 ObjectDataSource 添加到页面(单击可查看全尺寸图像)
这将自动启动 ObjectDataSource 控件的“选择数据源”向导。 ProductsBLL
从向导的第一个屏幕中选择类。
图 2:选择 ProductsBLL
类(单击以查看全尺寸图像)
由于我们想要显示有关特定产品的信息,因此我们希望使用该方法 GetProductByProductID(productID)
。
图 3:选择 GetProductByProductID(productID)
方法(单击以查看全尺寸图像)
由于我们选择的方法包括参数,因此向导还有一个屏幕,我们要求在其中定义要用于参数的值。 左侧的列表显示所选方法的所有参数。 只有 GetProductByProductID(productID)
一个 productID
。 在右侧,我们可以指定所选参数的值。 参数源下拉列表枚举参数值的各种可能源。 由于我们想要为 productID
参数指定硬编码值 5,请将参数源保留为 None,并在 DefaultValue 文本框中输入 5。
图 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
以及UpdateMethod
DeleteMethod
属性DeleteParameters
。 ObjectDataSource 的“选择数据源”向导会自动指定用于插入、更新和删除的方法,因此,除非明确清除这些方法 ProductBLL
,否则它们将包含在上述标记中。
访问此页面时,数据 Web 控件将调用 ObjectDataSource Select
的方法,该方法将使用输入参数的GetProductByProductID(productID)
硬编码值为 5 productID
调用ProductsBLL
类的方法。 该方法将返回一个强类型 ProductDataTable
对象,该对象包含一行,其中包含有关 Chef Anton's Gumbo Mix(具有 5 的产品 ProductID
)的信息。
图 5:显示有关 Chef Anton's Gumbo Mix 的信息(单击以查看全尺寸图像)
将参数值设置为 Web 控件的属性值
还可以根据页面上的 Web 控件的值设置 ObjectDataSource 的参数值。 为了说明这一点,让我们有一个 GridView,其中列出了用户指定的国家/地区中的所有供应商。 首先,将 TextBox 添加到用户可以在其中输入国家/地区名称的页面。 将此 TextBox 控件 ID
的属性设置为 CountryName
。 此外,添加按钮 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
对象的第一个示例略有不同。 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 调用,但值 null
将 GetSuppliersByCountry(country)
传递到该方法中。 TableAdapter 将null
转换为数据库NULL
值(DBNull.Value
),但该方法使用的GetSuppliersByCountry(country)
查询被写入,以便在为@CategoryID
参数指定值时NULL
不返回任何值。 简言之,没有供应商返回。
但是,在访问者进入某个国家/地区并单击“显示供应商”按钮以引起回发后,将重新查询 ObjectDataSource Select
的方法,并将 TextBox 控件 Text
的值作为 country
参数传入。
图 9:显示来自加拿大的供应商(单击以查看全尺寸图像)
默认显示所有供应商
在首次查看页面时,建议先显示所有供应商,而不是显示任何供应商,这样用户就可以通过在 TextBox 中输入国家/地区名称来分析列表。 当 TextBox 为空时,类SuppliersBLL
GetSuppliersByCountry(country)
的方法将传入null
其country
输入参数的值。 然后,此值 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