作者 :斯科特·米切尔
在本教程中,我们将演示如何使用设定为硬编码值的参数来选择要在 DetailsView 控件中显示的数据。
简介
在上一个教程中,我们介绍了如何使用绑定到从GetProducts()类调用ProductsBLL该方法的 ObjectDataSource 控件的 GridView、DetailsView 和 FormView 控件显示数据。 该方法 GetProducts() 返回一个强类型数据表,其中包含 Northwind 数据库 Products 表中的所有记录。 该ProductsBLL类包含用于仅返回产品子集的其他方法 ,GetProductByProductID(productID)GetProductsByCategoryID(categoryID)以及GetProductsBySupplierID(supplierID)。 这三种方法需要一个输入参数,指示如何筛选返回的产品信息。
ObjectDataSource 可用于调用需要输入参数的方法,但为此,我们必须指定这些参数的值来自何处。 参数值可以是硬编码的,也可以来自各种动态源,包括:查询字符串值、会话变量、页面上 Web 控件的属性值或其他控件。
本教程,我们首先演示如何使用预设硬编码值的参数。 具体而言,我们将介绍如何将 DetailsView 添加到页面中,以显示有关特定产品的信息,即 Chef Anton's 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:将使用硬编码参数值 5 于productID参数(单击以查看全尺寸图像)
完成“配置数据源”向导后,ObjectDataSource 控件的声明性标记在SelectParameters集合中包含用于SelectMethod属性中定义的方法的每个预期输入参数的Parameter对象。 由于本示例中使用的方法只需要一个输入参数, 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 方法,该方法将使用硬编码的输入参数值 5 调用 productID 类的 GetProductByProductID(productID) 方法。 该方法将返回一个强类型ProductDataTable对象,该对象包含一行,包含关于产品编号为ProductID 5的Chef Anton's Gumbo Mix的信息。
图 5:显示有关 Chef Anton's Gumbo Mix 的信息(单击以查看全尺寸图像)
将参数值设置为 Web 控件的属性值
还可以根据页面上的 Web 控件的值设置 ObjectDataSource 的参数值。 为了说明这一点,让我们有一个 GridView,其中列出了用户指定的国家/地区中的所有供应商。 首先,将 TextBox 添加到用户可以在其中输入国家/地区名称的页面。 将此 TextBox 控件 ID 的属性设置为 CountryName。 此外,添加 Web 按钮控件。
图 6:向页面添加 TextBox(IDCountryName 单击可查看全尺寸图像)
接下来,将 GridView 添加到页面,并从智能标记中选择添加新的 ObjectDataSource。 由于我们想要显示供应商信息,请从向导的第一个屏幕中选择 SuppliersBLL 该类。 从第二个屏幕中,选取 GetSuppliersByCountry(country) 方法。
图 7:选择 GetSuppliersByCountry(country) 方法(单击以查看全尺寸图像)
GetSuppliersByCountry(country)由于该方法具有输入参数,向导再次包含用于选择参数值的最终屏幕。 这一次,将参数源设置为“控制”。 这将使用页面上控件的名称填充 ControlID 下拉列表; CountryName 从列表中选择控件。 首次访问页面时, CountryName TextBox 将为空,因此不会返回任何结果,并且不显示任何结果。 如果要默认显示某些结果,请相应地设置 DefaultValue 文本框。
图 8:将参数值设置为 CountryName 控件值(单击可查看全尺寸图像)
ObjectDataSource 的声明标记与我们的第一个示例略有不同,使用了 ControlParameter 而不是标准的 Parameter 对象。 A ControlParameter 具有其他属性,用于指定 Web 控件的 ID 以及用于该参数的属性值(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 中的文本框是空的。 ObjectDataSource 的 Select 方法仍由 GridView 调用,但在 GetSuppliersByCountry(country) 方法中传递了一个值 null。 TableAdapter 将null 转换为数据库NULL 值(DBNull.Value),但 GetSuppliersByCountry(country) 方法使用的查询是这样编写的:当为 @CategoryID 参数指定 NULL 值时,该查询不返回任何值。 简言之,没有供应商返回。
但是,在访问者进入某个国家/地区并单击“显示供应商”按钮以引起回发后,将重新查询 ObjectDataSource Select 的方法,并将 TextBox 控件 Text 的值作为 country 参数传入。
图 9:显示来自加拿大的供应商(单击以查看全尺寸图像)
默认显示所有供应商
最好在用户首次查看页面时显示所有供应商,而不是不显示任何供应商,这样用户可以通过在文本框中输入国家/地区名称来缩小列表范围。 当 TextBox 为空时,SuppliersBLL 类的 GetSuppliersByCountry(country) 方法将 null 值传入其 country 输入参数。 然后,此 null 值被传递到 DAL 的 GetSupplierByCountry(country) 方法中,在那里它被转换为以下查询中 @Country 参数的数据库 NULL 值。
SELECT SupplierID, CompanyName, Address, City, Country, Phone
FROM Suppliers
WHERE Country = @Country
Country = NULL表达式始终返回 False,即使对于其Country列具有NULL值的记录,也不会返回任何记录。
若要在国家 TextBox 为空时返回所有供应商,我们可以扩充 BLL 中的 GetSuppliersByCountry(country) 方法,在国家参数为 GetSuppliers() 时调用 null 方法,否则调用 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 技术合作。 斯科特担任独立顾问、教练和作家。 他的最新书是 《Sams Teach Yourself ASP.NET 2.0 in 24 Hours》。 可以通过 mitchell@4GuysFromRolla.com 联系到他。
特别感谢
本教程系列由许多有用的审阅者审阅。 本教程的主要审阅者是希尔顿·吉森诺。 有兴趣查看即将发布的 MSDN 文章? 如果是这样,请给我写信。mitchell@4GuysFromRolla.com