一、
实现表现层:
显示分类列表。
前面我们已经实现了门类列表,当点击一个门类是,将重定向到一个页面,URl是这样的
http://localhost/BalloonShop/Catalog.aspx.?DepartmentID=1
在查询字符串中包括而来一个ID参数,等会有用了。
创建一个用户自定义控件CategoriesList.ascx
然后编辑下模板,具体代码如下:

Code

<%
@ Control Language="C#" AutoEventWireup="true" CodeFile="CategoriesList.ascx.cs" Inherits="UserControls_CategoriesList" %>
<asp:DataList ID="list" runat="server" CssClass="CategoryListContent"
Width="200px">
<HeaderTemplate>
Choose a Category
</HeaderTemplate>
<HeaderStyle CssClass="CategoryListHead" />
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl='<%#"../Catalog.aspx?DepartmentID="+
Request.QueryString["DepartmentID"]+
"&CategoryID="+Eval("CategoryID") %>'

Text='<%
#Eval("Name") %>'

ToolTip='<%
#Eval("CategoryID").ToString()==
Request.QueryString["CategoryID"]?"CategorySelected":"CategoryUnselected" %>'>[HyperLink1]</asp:HyperLink>
</ItemTemplate>
</asp:DataList>
<asp:Label ID="Label1" runat="server"></asp:Label>


后台代码为:

Code
public partial class UserControls_CategoriesList : System.Web.UI.UserControl


{
protected void Page_Load(object sender, EventArgs e)

{
string departmentId=Request.QueryString["DepartmentID"];
if (departmentId!=null )

{
list.DataSource = CatalogAccess.GetCategoriesInDepartment(departmentId);
list.DataBind();
Label1.Text = "<br/>";
}
}
}

这里和前面门类是差不多的东西,恩,我们走一遍。
运行网站,主页上会显示门类的列表,但是不会出现分类的列表,我们看上面的
if (departmentId!=null )
{
list.DataSource = CatalogAccess.GetCategoriesInDepartment(departmentId);
list.DataBind();
Label1.Text = "<br/>";
}
意思就是要是不选择门类的话,不会去给绑定数据源。
然后点击一个门类,就会出现这个门类下的分类列表。
看看URL的变化
此时还是http://localhost/BalloonShop/Catalog.aspx.?DepartmentID=X
可以看到,从Request.QueryString["DepartmentID"]传来的值给
list.DataSource = CatalogAccess.GetCategoriesInDepartment(departmentId);使用。
在点击任何一个分类url变为
http://localhost:52446/BallonShop/Catalog.aspx?DepartmentID=1&CategoryID=1
这里分类的ID也显示在上面了。有什么用处呢,后面看吧!
二、显示门类和分类的详细信息
建立Catalog.aspx页面,在里面添加两个Label控件。
没有什么好说的,直接看cs文件

Code
1
public partial class Catalog : System.Web.UI.Page
2

{
3
protected void Page_Load(object sender, EventArgs e)
4
{
5
PopulateControls();
6
}
7
8
9
//私有函数
10
private void PopulateControls()
11
{
12
//从上个页面获取门类ID
13
string departmentId=Request.QueryString["DepartmentID"];
14
//获取分类ID
15
string categoryId=Request.QueryString["CategoryID"];
16
//如果分类ID不为空的,就实例一个分类的详细信息结构,赋予两个label的值
17
if (categoryId!=null)
18
{
19
CategoryDetails cd = CatalogAccess.GetCategoyrDetails(categoryId);
20
catalogTitleLabel.Text = cd.Name;
21
catalogDescriptionLabel.Text = cd.Description;
22
this.Title = BalloonShopConfiguration.SiteName + ":Category:" + cd.Name;
23
}
24
//否则显示门类的信息
25
else if(departmentId!=null)
26
{
27
DepartmentDetails dd = CatalogAccess.GetDepartDetails(departmentId);
28
catalogTitleLabel.Text = dd.Name;
29
catalogDescriptionLabel.Text = dd.Description;
30
this.Title = BalloonShopConfiguration.SiteName + ":Department:" + dd.Name;
31
32
}
33
}
34
}
35
很简单。呵呵!
下面这个就是这章的重头戏,显示商品列表,带分页的。
创建一个ProductList.ascx

Code
1
<%
@ Control Language="C#" AutoEventWireup="true" CodeFile="ProductsList.ascx.cs"
2
Inherits="UserControls_ProductsList" %>
3
<asp:Label ID="pagingLabel" runat="server" CssClass="PagingText" Visible="false"></asp:Label>
4
<asp:HyperLink ID="previousLink" CssClass="PagingText" Visible="false" runat="server">Previous</asp:HyperLink>
5
<asp:HyperLink ID="nextLink" runat="server" CssClass="PagingText" Visible="false">Next</asp:HyperLink>
6
<p>
7
</p>
8
<asp:DataList ID="list" runat="server" RepeatColumns="2"
9
RepeatDirection="Horizontal">
10
<ItemTemplate>
11
<table cellpadding="0" align="left">
12
<tr height="105">
13
<td align="center" width="100">
14
<a href='Product.aspx?ProductID=<%#Eval("ProductID") %>'>
15
<img width="100" src='ProductImages/<%#Eval("Image1FileName") %>' border="0" />
16
</a>
17
</td>
18
<td valign="top" width="250">
19
<a class="ProductName" href='Product.aspx?ProductID=<%#Eval("ProductID") %>'>
20
<%
#Eval("Name") %>
21
</a>
22
<br />
23
<span class="ProductDescription"><%
#Eval("Price","{0:c}")%></span>
24
</td>
25
</tr>
26
</table>
27
</ItemTemplate>
28
</asp:DataList>
29
一个用来显示商品有多少页和当前页数,有两个超链接来换页。一个Datalist来显示商品列表。
里面一个图片链接,一个Name链接,一个商品的其他信息。
看cs文件

Code
1
using System;
2
using System.Collections;
3
using System.Configuration;
4
using System.Data;
5
using System.Linq;
6
using System.Web;
7
using System.Web.Security;
8
using System.Web.UI;
9
using System.Web.UI.HtmlControls;
10
using System.Web.UI.WebControls;
11
using System.Web.UI.WebControls.WebParts;
12
using System.Xml.Linq;
13
using System.Collections.Specialized;
14
15
public partial class UserControls_ProductsList : System.Web.UI.UserControl
16

{
17
protected void Page_Load(object sender, EventArgs e)
18
{
19
PopulateControls();
20
}
21
22
//私有方法
23
private void PopulateControls()
24
{
25
//获取门类和分类ID
26
string departmentId=Request.QueryString["DepartmentID"];
27
string categoryId=Request.QueryString["CategoryID"];
28
//获取当前页数,第一次没有,就自定义为1
29
string page=Request.QueryString["Page"];
30
if (page==null )
31
{
32
page = "1";
33
}
34
35
string searchString = Request.QueryString["Search"];
36
37
//定义变量有多少页
38
int howManyPages = 1;
39
40
if (searchString != null)
41
{
42
string allWords=Request.QueryString["AllWords"];
43
list.DataSource = CatalogAccess.Search(searchString,allWords,page,out howManyPages);
44
list.DataBind();
45
}
46
//如果分类不为空,调用GetProductsInCategory方法,这个的完成的业务回头看业务层去。传入参数
47
//是分类ID,当前也数,肯定是1,公多少页。函数执行后就会返回一个table,里面是第一个的所有商品信息,
48
//howManyPages在函数里被修改为经过计算的值。然后数据绑定,就完成了初始化。
49
else if (categoryId!=null )
50
{
51
list.DataSource = CatalogAccess.GetProductsInCategory(categoryId,page,out howManyPages);
52
list.DataBind();
53
}
54
else if(departmentId!=null )
55
{
56
list.DataSource = CatalogAccess.GetProductsOnDepartmentPromotion(departmentId, page, out howManyPages);
57
list.DataBind();
58
}
59
else
60
{
61
list.DataSource = CatalogAccess.GetProductsOnCatalogPromotion(page,out howManyPages );
62
list.DataBind();
63
}
64
65
//看看分页,当总页大于1时,就要分页。
66
if (howManyPages>1)
67
{
68
//获取当前页
69
int currentPage = Int32.Parse(page);
70
//显示多页的控件,和翻页控件
71
pagingLabel.Visible = true;
72
previousLink.Visible = true;
73
nextLink.Visible = true;
74
pagingLabel.Text = "Page"+page+"of"+howManyPages.ToString();
75
//如果当前页为1,那么前页连接不可用,但是可见的。
76
if (currentPage==1)
77
{
78
previousLink.Enabled = false;
79
}
80
//这里可能下面的有些代码可能不清楚,我刚开始看也是第一次见。不怕,全部打上断点,运行起来一行行的看每个
81
//变量值的变化情况就全部清楚了。嘿嘿,比如说AllKeys[i],你不知道什么是键什么是值,仔细看看就知道了。
82
else
83
![]()