# ProductDetails.aspx 页面

说明： ProductDetail页面用于显示某特定产品的具体信息。

使用说明： ProductDetails页面在用户点击ProductsList.aspx页面上的特定产品链接时显示。要显示的产品的ProductID作为URL查询字符串传递给该页面（例如："ProductDetails。aspx?ProductID=363")。可以查看ProductsList.aspx来了解在为ProductDetails页面创建超链接时，如何添加该参数。

ProductsList页面的逻辑被完全封装到Page_Load事件句柄中。当页面被浏览器的客户端访问的时候Page_Load事件句柄才被调用。

Page_Load 事件句柄： Page_Load事件句柄从页面的Request对象的参数集合中获取指定的ProductID参数的值参量集合包含由客户端发出的HTTP请求中的所有查询字符串，表单域，cookie和服务器变量。这是一个典型的API，页面开发者通过这个API可以得到页面间进行切换时传递的参数。

在将 ProductID 转换为整型变量后， Page_Load事件句柄创建了ProductDB类的一个实例，将ProductID传递给其GetProductDetails方法并调用之。这一方法内部调用了ProductDetail 存储过程来从Commerce数据库获得产品信息。

一旦产品数据从数据库中获得，就被送入网页的一系列服务器控件中。大部分的服务器控件都是标准的ASP.NET控件(labels， images， hyperlinks，等等)。但是，有两种服务器控件是commerce starter kit 自定义用户控件。我们编写这两个控件是为了封装产品的" Review List”以及一个用于显示购买当前产品的用户购买的其它产品的列表（Also Bought）。需要说明的是， 与其它服务器控件一样，可以对这些服务器控件进行编程操作(设置/获取属性，调用方法，激活/挂起事件)。它们提供了一种有效的方法实现封装和重用功能，同时可以在多个开发者之间清晰的划分任务。

添加到购物车： Page_Load事件句柄的倒数第三行代码动态地创建"Add To Cart"链接，当点击该链接时，将产品添加到用户的购物车。该链接指向AddToCart.aspx页面，并向该页面的超级链接传递一个ProductID作为动态生成的查询字符串参数。

需要说明的是，尽管可以通过一个ImageButton按钮返回到购买商品所在ProductsList。aspx 页面，实现添加功能，但是我们却由于下面的原因，采取了前面介绍的方法：

1. 更好地重用AddToCart逻辑。Commerce Starter Kit允许用户从ProductsList.aspx页面、ProductDetails.aspx页面和 SearchResults.aspx 页面向其购物车中添加产品。这些页面共享AddToCart页面的逻辑。
2. 更好地使用缓冲输出。如果每个"AddToCart"链接都指向各自相应的页面，那么对于该页面来说就会有过多的缓冲输出入口。每个入口对应唯一的查询字符串值。

性能说明：

- 我们将此页面的结果是为了使其性能最大化。这可以通过在页面顶端添加一个缓冲输出指令来实现。缓冲输出在本例中，我们选择每分钟（60秒）缓存输出页面一次。ASP。NET将会自动为每个不同的查询字符串存储一个缓存入口——将会为后续请求自动提供适当的值。

              <%@ OutputCache Duration="60" VaryByParam="ProductID" %>