很简单,和查询结果的显示一样,用了SimplePager这个不完全自用户控件,不同的只是显示的列不同而已。根据数据库的结构。商品相关的表有三张,category,product,item。
category表示的是商品的大类,product是一类商品的粗略分类,item表示的详细的一种商品。所以用户浏览商品的顺序是category->product-> item,直到找到自己满意的商品。在页面顺序是:Default.ASPx-> Category.ASPx-> Items.ASPx。
首先说一下Default.ASPx
category是通过table来显示的。表格比较复杂,但看清楚了其实也不复杂,如下:
|
Images/lizardC.gif |
mainMap | |||
|
空白 |
空白 |
Category |
空白 | |
category的显示主要就在category和mainMap。都是通过href实现的,点击页面就会导航到Category.ASPx,并把categoryID传过去。其实我觉得把Category.ASPx命名为Product.ASPx似乎更容易理解,表示显示的product的产品。
1. Category.ASPx
product的显示,通过SimplePager控件。控件初始化的时候调用OnLoad事件,最后调用PageChanged事件,完成显示。到目前为止出现SimplePager的共有三处地方,Category.ASPx,Items.ASPx, Search.ASPx;后面还有一个页面checkout.ASPx也用到了,可见SimplePager在petshop中的重要性。
2. Items.ASPx
Item的显示,原理同product的一样。
3. 重写,用户控件SimplePager
至于说SimplePager是一个不完全用户控件,是因为它仅仅继承了一下Repeater,增加了一个分页功能。没有自己的显示和后台代码。Petshop有四处用到了SimplePager,所以有四处的后台代码要写PageChange方法。作为电子商务网站,商品很多,要显示数据的地方很多,显示的途径也很多。可能要显示某类商品的相关信息,或者最新的商品信息,或者畅销的商品信息…...如果还有后台维护的话,要显示的东西就更多了,自然要写的PageChange方法就很多了。其实这么多PageChange方法,在大体上都是一样的,在petShop中就能看出来,只有在checkout.ASPx中变化较大,所以能不能将它重构一下呢,或者说写一个用户控件,注意,是用户控件,不是自定义控件。是以ascx结尾的,不是自定义控件,所以只对于某一个项目适用。举例修改如下(举例Category):
在SimplePager中重写ItemTemplate属性:

public class SimplePager : Repeater
{
……
public override ITemplate ItemTemplate
{
get
{
return base.ItemTemplate;
}
set
{
base.ItemTemplate = value;
}
}
……
}
在Category.ASPx.cs中定义CategoryTemplate,CategoryTemplate继承自ITemplate
public class CategoryTemplate: ITemplate 
{
//模板列
public void InstantiateIn(Control container) 
{
LiteralControl l = new LiteralControl();
l.DataBinding += new EventHandler(this.Date_DataBinding);
container.Controls.Add(l);
//数据绑定
container.Controls.Add(l);
//为模板列加入LiteralControl
} 
private void Date_DataBinding(object sender, EventArgs e)
{
LiteralControl protuctDate = (LiteralControl) sender;
RepeaterItem container = (RepeaterItem) protuctDate.NamingContainer;
protuctDate.Text = @"<TR class="gridItem">";
protuctDate.Text += "<TD><A href="Items.ASPx">";
protuctDate.Text += (string) DataBinder.GetPropertyValue(
container.DataItem, "Id", "{0:d}");
protuctDate.Text += "</TD></A>";
protuctDate.Text += "<TD>";
protuctDate.Text += (string) DataBinder.GetPropertyValue(
container.DataItem, "Name", "{0:d}");
protuctDate.Text += "</TD>";
protuctDate.Text += @"</TR>";
}
}
然后只要设置以下控件的ItemTemplate属性就可以了。这样就将Category.ASPx中SimplePager的ItemTemplate中的变化封装到了后台,然后还可以重写headertemplate等,从而使编写拥有统一前台的SimplePager用户控件成为了可能。
前台的HTML就可以统一简化为:
<HeaderTemplate>
</HeaderTemplate>
<ITEMTEMPLATE>
</ITEMTEMPLATE>
<FOOTERTEMPLATE></TBODY></TABLE></FOOTERTEMPLATE>
进一步修改,可以把PageChange方法直接定义到SimplePager的后台代码中,并提供一个公共的访问接口,如果不需要时也可以用代理取消订阅,再重新订阅新的方法。这样每次使用SimplePager时,只需要调用几个属性赋一下值就行了。现在唯一存在可能就是性能方面的问题了,有待于进一步的学习。关于Reapter的一些动态绑定的方法可以参看以下地址的文章:http://msdn.microsoft.com/msdnmag/issues/05/06/CuttingEdge/default.ASPx?fig=true#