读书:《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文件
1public 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
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文件
1using System;
2using System.Collections;
3using System.Configuration;
4using System.Data;
5using System.Linq;
6using System.Web;
7using System.Web.Security;
8using System.Web.UI;
9using System.Web.UI.HtmlControls;
10using System.Web.UI.WebControls;
11using System.Web.UI.WebControls.WebParts;
12using System.Xml.Linq;
13using System.Collections.Specialized;
14
15public 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 {
84 //query的集合。
85 NameValueCollection query = Request.QueryString;
86 string paraName, newQueryString = "?";
87
88 //设置previousLink的URL
89 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链接的URL
107 else
108 {
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
最后是显示商品的详细信息,和前面的门类详细信息是原理是一样的。就不说了。
这里整个商品的显示就完成了!
有很多需要自己思考的东西,好好体味一下吧!