作业要求

这是《ASP.NET》课程的最后大作业,集成了许多功能要求。

综合训练上机实验
[2016-5-25]
企业级.NET应用开发课程作业——基于.NET的图书销售系统
说明:类似于当当网、卓越网或china-pub的网上图书销售系统,简易版,要求完成的功能如下:
a)用户管理模块(登录功能);
b)商品管理模块(用户浏览商品功能、管理员对于商品的增、删、改、查管理功能);
c)购物车模块(购买功能);
d)订单管理模块(生成订单、订单管理)。

登录

登录用户的名称

使用VS自带的Login控件就能满足大多数要求,如果觉得不好看,就加一个自己喜欢的CSS样式。那么,登陆后如何调取登录用户的名字呢?先添加头文件

1
using System.Web.Security;

在使用

1
Label1.Text = Membership.GetUser().UserName.ToString();

获取当前登录的用户的名称。这个Membership方法里还可以获取很多其他东西。看官们自己慢慢发掘。

判断是否登录

1
if(Request.IsAuthenticated==true)

判断用户的登录登录角色

1
if (User.IsInRole("Admin"))

连接数据库

连接字符串型

这个方法和我的另一篇文章,《VB_SQL》中的方法非常类似,大家可以参考那篇文章。

Linq to SQL

这是ASP.net自带的,功能非常非常强大的方法,如果不学这个,那么你的ASP就可以说是白学了。

原理

Linq to SQL 的原理非常简单,就是把数据库里的表格,操作,信息,封装成class,保存到你的网站目录下,ASP操作封装的Class,再去更新数据库。差不多就是这个意思。

操作

  1. 新建App_Code文件夹,新建LINQ TO SQL类,然后打开服务器资源管理器,把你的数据库表格拖到页面里(很难用语言说明那个页面,你试试就知道了),保存。
  2. 新建LinqDataSource控件,打开智能选择键,选择数据源设置,选择你要的数据源,如果你第一步没有重命名的话,应该是“DataClassesDataContext”
  3. 各种DIY设置。
  4. GridView绑定数据源,在浏览器上看看效果吧。

操作数据库

1
2
3
4
5
6
7
8
9
10
11
12
DataClassesDataContext db = new DataClassesDataContext();
var results= from r in db.Item where r.Iowner==Membership.GetUser().UserName.ToString() && r.Ibno == x select r;
//r是临时变量名,r选择出来的信息保存在results中
if (results != null)
{
foreach(var r in results)
{
r.Inumber++;
r.Isum += r.Iprice;
db.SubmitChanges();
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var fr = from r1 in db.Books where r1.Bno==x select r1;
//Item是被封装的一个表格类
Item it = new Item();
foreach (var r1 in fr)
{
it.Iowner = Label1.Text.ToString();
it.Ibno = x;
it.Inumber = 1;
it.Iprice = r1.Bprice;
it.Isum = r1.Bprice;
it.Iname = r1.Bname;
db.Item.InsertOnSubmit(it);
db.SubmitChanges();
}

GridView+ButtonField

  1. GridView中通过智能键添加ButtonField,类别是button。
  2. aspx端添加代码OnRowCommand=”GridView1_RowCommand”
  3. CS端,写如下代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
    if (Request.IsAuthenticated == true)
    {
    int po;
    po = int.Parse(e.CommandArgument.ToString());
    //取出当前行号
    DataClassesDataContext db = new DataClassesDataContext();
    var results = from r in db.Books where r.Bno == int.Parse(GridView1.Rows[po].Cells[0].Text.ToString()) select r;
    if (results != null)
    {
    foreach (var r in results)
    {
    if (r.Bnumber >= 1)
    {
    r.Bnumber--;
    }
    else
    Response.Write("<script language='javascript'>alert('缺货');</script>");
    }
    }
    db.SubmitChanges();
    DataBind();
    }
    else
    {
    Response.Write("<script language='javascript'>alert('请先登录');</script>");
    }
    }

GridView+BoundField

以下代码仅供参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
DataBind();
}
//删除之后重新绑定
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
DataClassesDataContext db = new DataClassesDataContext();
TableCell tp = new TableCell();
tp = GridView1.Rows[e.RowIndex].Cells[2];
var results = from r in db.Books where r.Bno == int.Parse(tp.Text.ToString()) select r;
if (results != null)
{
foreach (var r in results)
db.Books.DeleteAllOnSubmit(results);
}
db.SubmitChanges();
DataBind();
}
////更新
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
DataClassesDataContext db = new DataClassesDataContext();
TableCell tp = new TableCell();
tp = GridView1.Rows[e.RowIndex].Cells[2];
var results = from r in db.Books where r.Bno == int.Parse(tp.Text.ToString()) select r;
if (results != null)
{
foreach (var r in results)
{
r.Bno =int.Parse( GridView1.Rows[e.RowIndex].Cells[2].Text.ToString());
r.Bname = GridView1.Rows[e.RowIndex].Cells[3].Text.ToString();
r.BCno=int.Parse( GridView1.Rows[e.RowIndex].Cells[4].Text.ToString());
r.Bpno=int.Parse( GridView1.Rows[e.RowIndex].Cells[5].Text.ToString());
r.Bprice=float.Parse( GridView1.Rows[e.RowIndex].Cells[6].Text.ToString());
r.Bnumber=int.Parse( GridView1.Rows[e.RowIndex].Cells[7].Text.ToString());
}
}
db.SubmitChanges();
DataBind();
}
//取消
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridView1.EditIndex = -1;
DataBind();
}

意外问题

使用LinqDataSource出现“找不到与ViewState中存储的原始值中的给定键相匹配的行,请确保”keys”字典包含与上一个Select操作返回的行对应的唯一键值”错误的解决办法

解决方法:
把LinqDataSource的EnableViewState属性设置为False。