# AlsoBought 用户控件

说明：The AlsoBought 用户控件列出了购买特定产品的顾客最经常购买的5项其他产品的一个列表。

点击这里可以了解什么是用户控件以及它们是如何在ASP.NET网络应用程序中使用的更多知识

使用说明： AlsoBought 控件被用于ProductDetails.aspx页面中。

AlsoBought 用户控件在文档的顶端展示了一个公共的区域—产品号。这使得AlsoBought 用户控件(比如ProductDetails.aspx页面)的消费者或以程序方式或以清楚声明的方式(经由标签属性实现)设置AlsoBought产品的产品号。说明一下，只有那些声明为public的域，属性和方法才可以通过这种方式被外部访问。比如说， Page_Load事件句柄没有被声明为public，因而不能被roductDetails.aspx页面调用。

AlsoBought 用户控件逻辑被完全封装到它的Page_Load 事件句柄中。当浏览器客户端的用户访问这个包含用户控件的页面时，Page_Load事件句柄就会被调用。

Page_Load 实践句柄： Page_Load 事件句柄创建了一个ProductDB类的实例，并调用GetProductsAlsoPurchased方法，将产品号传给它。该方法通过调用CustomerAlsoBought存储过程从Commerce数据库中获取产品信息。

产品集合使用一个模板式的服务器控件来展示。当Repeater服务器控件在用户控件中使用时，它含有三个客户定义的模板- HeaderTemplate, ItemTemplate and FooterTemplate, 他们描述了表单外观。ItemTemplate模板定义了被绑定数据的显示方式， HeaderTemplate 模板定义了在表单开始发出的HTML外观， FooterTemplate模板定义了在表单最后发出的HTML外观。

ProductsDB.GetProductsAlsoPurchased()方法返回的数值通过设置数据源的属性被封装到Repeater中，然后就会调用它的DataBind() 方法。当DataBind() 方法被调用时，Repeater将调用其HeaderTemplate，并会反复将其ItemTemplate模板的拷贝反复应用到数据源的每一行，并从数据行获取数据。最后Repeater将调用其FooterTemplate模板。

性能说明：

- AlsoBought 用户控件与PopularItems的用户控件不同，PopularItems的用户控件的目的和逻辑非常的相似，而AlsoBought 用户控件却没有对productsDB.getProducesAlsochased()方法产生的结果进行缓冲。这是因为 AlsoBought 用户控件现在仅用在ProductDetails.aspx页面中，而后者本身使用输出缓冲。所以，AlsoBought 用户控件产生的结果由其所在页面进行缓冲。