一个小型WEB
项目,MYComics的漫画网站
。对微软的讲座断断续续看完后,自己动手照着做了下,看来真是万事事必躬亲才知其中滋味啊。
算是摸了点ASP.NET2.0的皮毛
,这里我主要写写Profile服务,即针对用户收藏架那块。
.开发软件:.NET2005和SQL2005Express版本。
SQL2000也能完成这个项目,只不过在最初我使用SQL2000时,打开源码会有末名奇妙BUG,说连不上SQL2005…..我当时还没装SQL2005呢....
折腾了半天,把能试的都试遍了就差重装系统了。发现是微软的一个BUG!,网上说是现在要付费才给弄,最后按一个网友说的直接删除一个文件
才算平息。
.MyComics是一个网站书店,整体来讲,具备的业务功能有,算是需求分析吧:
.
按类别查看不同的漫画书
.
对漫画书的列表可以按不同的字段进行排序
.
查看漫画书的详细资料,包括图片
. 将选中的漫画书添加到收藏架
.
收藏架中的漫画书下次登陆时仍然存在
.实施方案:
1.创建数据库,实现商品查看与管理功能。
2.实现商品查看与管理功能:主要利用GRIDVIEW,DataList,ObjectDataSource,SQLDataSource四个控件完成。
3.创建网站母版,规划网站风格.
CREATE
DATABASE
MyComics
GO
USE
MyComics
GO
CREATE
TABLE
[
Books
]
(
[
ComicID
]
[
int
]
IDENTITY
(
100
,
1
)
NOT
NULL
,
[
Title
]
[
varchar
]
(
64
)
NOT
NULL
,
[
Number
]
[
smallint
]
NOT
NULL
,
[
Year
]
[
smallint
]
NOT
NULL
,
[
Grade
]
[
decimal
]
(
3
,
1
)
NOT
NULL
,
[
CGC
]
[
bit
]
NOT
NULL
,
[
BookValue
]
[
money
]
NULL
DEFAULT
(
0
) ,
[
LargeCover
]
[
varchar
]
(
64
)
NOT
NULL
,
[
SmallCover
]
[
varchar
]
(
64
)
NULL
,
[
Comment
]
[
varchar
]
(
512
)
NULL
,
CONSTRAINT
[
PK_Books
]
PRIMARY
KEY
CLUSTERED
(
[
ComicID
]
)
ON
[
PRIMARY
]
)
ON
[
PRIMARY
]
GO
INSERT
INTO
Books (Title,
Number
,
Year
, Grade, CGC, BookValue,LargeCover, SmallCover, Comment)
VALUES
(
'
Bugslayer Comics
'
,
1
,
2001
,
9.0
,
0
,
45.00
,
'
mm_01.jpg
'
,
'
mm_01_small.jpg
'
,
'
First title in the Bugslayer Comics series.
'
)
4.
收藏架(Favorites
)的实现,Profile
的应用。
以往的做法就是在数据库里建表,通过ADO.NET
的代码,连接数据库,把想收藏的书目的相关信息存进数据库,实现数据存储。
Profile服务:
它能保存个人信息,跳过数据库,可以持久保存,支持认证用户和匿名用户,在你下次登入后,数据仍然可见。
注意点:
使用HttpContext.
Current.Profile
属性可以在外部组中访问Profile
,就是指在其他类访Profile.
例:
HttpContext
.Current.Profile.GetPropertyValue("A"));
A
即为Profile的变量名。(下面代码有用到)
当建立Web应用程序时,要花费了大量的精力用于做一些事情,其中的一个就是写一些用于从数据库存储和获得用户信息的代码。
“Profile对象引入帮助我们从乏味的编码工作中解脱出来”.不过说实话,在这个例子里,我没发现它的优越的地方,一样要写数据库连接的代码,只不过不用新建表,有待进一步研究.
在webconfig里的system.web节点声明Profile的属性,见第5行。
Favorites是Profile的属性名称,FavoritesComics是类名,serializeAs是指定串行化方式Binary。
1
<
configuration
>
2
<
system
.web
>
3
<
profile
>
4
<
properties
>
5
<
add
name
=" Favorites "
type
="FavoritesComics"
serializeAs
="Binary"
/>
6
</
properties
>
7
</
profile
>
8
</
system.web
>
9
</
configuration
>
10
接下来,新建一个FavoriteComics类:
public class FavoriteComics
{
public ArrayList IDs=new ArrayList(); //定义一个数组,存储我将收藏的商品ID
public void AddComic(int id)… //加进收藏架
public void RemoveComic(int id)… //从收藏架移除
public bool IsInFavoritesList(int id)… //判断是否在收藏的数组中
public SqlDataReader GetFavorites()… //连接数据库的
}
详细代码如下:
[Serializable]
public
class
FavoriteComics
{
public
ArrayList IDs
=
new
ArrayList();
public
FavoriteComics()
{
}
public
void
AddComic(
int
id)
{
IDs.Add(id);
}
public
void
RemoveComic(
int
id)
{
for
(
int
i
=
0
; i
<
IDs.Count; i
++
)
{
int
temp
=
(
int
)IDs[i];
if
(temp
==
id)
{
IDs.RemoveAt(i) ;
break
;
}
}
}
public
bool
IsInFavoritesList(
int
id)
{
return
IDs.Contains(id);
}
public
SqlDataReader GetFavorites()
{
string
connString
=
WebConfigurationManager.ConnectionStrings[
"
MyComicsConnectionString
"
].ConnectionString;
//获得连接数据库的字符串
SqlConnection conn
=
new
SqlConnection();
conn.ConnectionString
=
connString;
string
where
=
"
1=2
"
;
foreach
(
object
o
in
IDs)
{
where
=
where
+
"
or ComicID=
"
+
(
int
)o
+
"
"
;
}
string
sql
=
"
SELECT [ComicID], [Title], [Year] , [Number], [Grade], [BookValue]FROM [Books] where
"
+
where;
conn.Open();
SqlCommand cmd
=
new
SqlCommand(sql, conn);
return
cmd.ExecuteReader();
}
}
Profile的使用:
这里,针对一个LINKBUTTON(Add this comic to my Favorite list):
1
protected
void
LinkButton1_Click(
object
sender, EventArgs e)
2
{
3
4
int
id
=
Convert.ToInt32(DetailsView1.Rows[
1
].Cells[
1
].Text); //由于相关模块没有列出来,这里的作用就是获得ComicID
5
6
7
if
(LinkButton1.CommandName
==
"
Add
"
)
//
见
Page_LoadComplete()事件
8
{
9
//使用profile
10
if
(Profile.Favorites
==
null
)
11
Profile.Favorites
=
new
FavoriteComics();
12
Profile.Favorites.AddComic(id);
13
}
14
else
15
Profile.Favorites.RemoveComic(id);
16
}
17
18
void
Page_LoadComplete(
object
sender, EventArgs e)
19
{
20
//
获得ComicID
21
int
id
=
Convert.ToInt32(DetailsView1.Rows[
1
].Cells[
1
].Text);
22
23
24
if
(Profile.Favorites
==
null
||
!
Profile.Favorites.IsInFavoritesList(id))
25
{
26
LinkButton1.Text
=
"
Add this comic to my Favorites list
"
;
27
LinkButton1.CommandName
=
"
Add
"
;
28
}
29
else
30
{
31
LinkButton1.Text
=
"
Remove this comic from my Favorites list
"
;
32
LinkButton1.CommandName
=
"
Remove
"
;
33
}
34
}
35
最后定义了一个FavoritesDB class,为的是与ObjectSource绑定,让GridView显示收藏的结果。
1
public
class
FavoritesDB
2
{
3
public
FavoritesDB()
4
{
5
6
7
8
}
9
public
SqlDataReader GetFavorites()
10
{
11
return
((FavoriteComics)HttpContext.Current.Profile.GetPropertyValue(
"
Favorites
"
)).GetFavorites();
12
13
14
}
15
16
public
void
RemoveComic(
int
ComicID)
17
{
18
((FavoriteComics)HttpContext.Current.Profile.GetPropertyValue(
"
Favorites
"
)).RemoveComic(ComicID);
19
}
20
}
21
Gridview显示结果: