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

<%
@ 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>

后台代码为:
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/>";
}
意思就是要是不选择门类的话,不会去给绑定数据源。
然后点击一个门类,就会出现这个门类下的分类列表。
此时还是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文件
1
public partial class Catalog : System.Web.UI.Page2


{ 3
protected void Page_Load(object sender, EventArgs e)4

{5
PopulateControls(); 6
}7

8

9
//私有函数10
private void PopulateControls()11

{ 12
//从上个页面获取门类ID13
string departmentId=Request.QueryString["DepartmentID"];14
//获取分类ID15
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
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文件
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.UserControl16


{17
protected void Page_Load(object sender, EventArgs e)18

{19
PopulateControls();20
}21

22
//私有方法23
private void PopulateControls()24

{ 25
//获取门类和分类ID26
string departmentId=Request.QueryString["DepartmentID"];27
string categoryId=Request.QueryString["CategoryID"];28
//获取当前页数,第一次没有,就自定义为129
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
else60

{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
else83

{84
//query的集合。85
NameValueCollection query = Request.QueryString;86
string paraName, newQueryString = "?";87

88
//设置previousLink的URL89
for (int i = 0; i < query.Count; i++)90

{91
if (query.AllKeys[i]!=null)92

{93
if ((paraName=query.AllKeys[i].ToString()).ToUpper()!="PAGE")94

{95
newQueryString += paraName + "=" + query[i] + "&";96
previousLink.NavigateUrl = Request.Url.AbsolutePath + newQueryString + "Page=" + (currentPage - 1).ToString();97
}98
}99
}100
}101

102
if (currentPage==howManyPages)103

{104
nextLink.Enabled = false;105
}106
//设置Next链接的URL107
else108

{109
NameValueCollection query = Request.QueryString;110
string paraName, newQueryString = "?";111
for (int i = 0; i < query.Count; i++)112

{113
if (query.AllKeys[i]!=null)114

{115
if ((paraName = query.AllKeys[i].ToString()).ToUpper() != "PAGE")116

{117
newQueryString += paraName + "=" + query[i] + "&";118
nextLink.NavigateUrl = Request.Url.AbsolutePath + newQueryString + "Page=" + (currentPage + 1).ToString();119
}120
}121
}122
}123
}124
}125
}126

最后是显示商品的详细信息,和前面的门类详细信息是原理是一样的。就不说了。
这里整个商品的显示就完成了!
有很多需要自己思考的东西,好好体味一下吧!
浙公网安备 33010602011771号