学习PetShop3.0(4)petshop商品的浏览
学习PetShop3.0(4)petshop商品的浏览
很简单,和查询结果的显示一样,用了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 override ITemplate ItemTemplate
{
get
{
return base.ItemTemplate;
}
set
{
base.ItemTemplate = value;
}
}
……
}
在Category.aspx.cs中定义CategoryTemplate,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#
posted on 2006-06-26 19:24 whoisyorudady 阅读(846) 评论(1) 编辑 收藏 举报