Mine.Net

 

学习PetShop3.0(4)petshop商品的浏览

学习PetShop3.04petshop商品的浏览

很简单,和查询结果的显示一样,用了SimplePager这个不完全自用户控件,不同的只是显示的列不同而已。根据数据库的结构。商品相关的表有三张,categoryproductitem

category表示的是商品的大类,product是一类商品的粗略分类,item表示的详细的一种商品。所以用户浏览商品的顺序是category->product-> item,直到找到自己满意的商品。在页面顺序是:Default.aspx-> Category.aspx-> Items.aspx

    首先说一下Default.aspx

category是通过table来显示的。表格比较复杂,但看清楚了其实也不复杂,如下:

   

Images/lizardC.gif

mainMap

空白

空白

Category

空白


    category
的显示主要就在categorymainMap。都是通过href实现的,点击页面就会导航到Category.aspx,并把categoryID传过去。其实我觉得把Category.aspx命名为Product.aspx似乎更容易理解,表示显示的product的产品。


1.  
Category.aspx

product的显示,通过SimplePager控件。控件初始化的时候调用OnLoad事件,最后调用PageChanged事件,完成显示。到目前为止出现SimplePager的共有三处地方,Category.aspxItems.aspx, Search.aspx;后面还有一个页面checkout.aspx也用到了,可见SimplePagerpetshop中的重要性。

    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中定义CategoryTemplateCategoryTemplate继承自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
SimplePagerItemTemplate中的变化封装到了后台,然后还可以重写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  阅读(845)  评论(1编辑  收藏  举报

导航