RSSAsp.net

Cách tạo và xử lý giỏ hàng trong ASP.Net

Chào mọi người, trong các vấn đề cơ bản của học thiết kế web là tạo và xử lý giỏ hàng, tuy nói là cơ bản nhưng được đánh giá là rất khó, hôm nay mình chia sẻ với các bạn cách thiết lập một giỏ hàng đơn giản trong ASP.Net

Chào mọi người, trong các vấn đề cơ bản của học thiết kế web là tạo và xử lý giỏ hàng, tuy nói là cơ bản nhưng được đánh giá là rất khó, hôm nay mình chia sẻ với các bạn cách thiết lập một giỏ hàng đơn giản trong ASP.Net

Một website bán hàng ngoài các vấn đề về sản phẩm, khuyến mãi, khách hàng… thì giỏ hàng và đơn hàng là một trong các tính năng không thể thiếu, nó mang cho phép người dùng chọn mua sản phẩm, nhóm sản phẩm, đặt hàng online, cho phép bạn đánh giá doanh thu, thông kê đơn hàng … với một giỏ hàng chuyên nghiệp đầy đủ các tính năng thì còn nói lên sự chuyên nghiệp trong dịch vụ của bạn.

1. Mô tả CSDL

Không nói dông dài nữa, ai cũng biết tầm quan trọng của nó rồi thì bây giờ mình tiến hành vào phâm tích vấn đề mình cần làm. Muốn thiết lập và xử lý giỏ hàng bạn cần xét các trường liên quan như: sản phẩm, khách hàng hai thành phầm trực tiếp đó trả lời cho hai câu hỏi, ai mua? và mua gì?

Ngoài ra nó còn phát sinh ra đơn hàng, chi tiết đơn hàng vì khi chọn sản phẩm lưu vào thì phải có bảng lưu đó là đơn hàng, tuy nhiên trong một đơn hàng có một hay nhiều sản phẩm do đó phải phát sinh ra chi tiết đơn hàng. Nếu phân tích sâu thì bạn có thêm phương thức thanh toán… Mời bạn tham khảo phần phân tích cơ sở dữ liệu sẽ nắm rõ hơn.

Mô tả CSDL thiết lập giỏ hàng ASP.Net

Mô tả CSDL thiết lập giỏ hàng ASP.Net

2. Thiết lập giỏ hàng ASP.Net

Đầu tiên mình sẽ vào phân tích các file phát sinh trong lúc mình tạo giỏ hàng ASP.Net: trang thứ nhất là trang dùng trình bày các sản phẩm, thường là trang chủ, trang thể loại sản phẩm, chi tiết sản phẩm … tiếp theo trang giỏ hàng, trang thanh toán … ngoài ra còn các tràng thông báo khi cần thiết…

Trong trang hiển thị sản phẩm bạn cần xem lại bài: Sử dụng – đổ dữ liệu vào DataList trong ASP.Net trong này cần chú ý đến nút mua hàng, bạn khai báo như hình sau:

Tùy chỉnh nút mua hàng ASP.Net

Tùy chỉnh nút mua hàng ASP.Net

Bạn vào trang hiển thị sản phẩm ở đây mình ví dụ là TrangChu.aspx cho dễ nha! Mở trang TrangChu.cs lên bạn khai báo:

<!--
    static DataTable tbGioHang = new DataTable();
-->

Xin nhắc lại là đến đây bạn đã có giao diện rồi nha, khai báo trên giống như một đối tượng, ở đây bạn hiểu là một biến có kiểu là table cũng được nó sẽ là nơi lưu trữ tạm thời các dữ liệu của giỏ hàng bạn trươc khi phiên giao dịch kết thúc.

Tiếp đến bạn vào trong Page_Load khai báo như sau:

<!--
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Session["GioHang"] != null)
            {
                tbGioHang = Session["GioHang"] as DataTable;
            }
            else
            {
                tbGioHang.Rows.Clear();
                tbGioHang.Columns.Clear();
                tbGioHang.Columns.Add("idSP", typeof(int));
                tbGioHang.Columns.Add("TenSP", typeof(string));
                tbGioHang.Columns.Add("Gia", typeof(double));
                tbGioHang.Columns.Add("SoLuong", typeof(int));
                tbGioHang.Columns.Add("TongTien", typeof(double), "SoLuong * Gia");
            }
            load_data();
        }
    }
-->

Nếu giỏ hàng của chúng ta là null thì gáng biến Session["GioHang"] nếu chưa rõ biến session thì bạn xem lại bài đối tượng cookies và session trong ASP.Net. Nếu đã có rồi thì mình sẽ xóa sạch các dữ liệu và tiến hành phiên làm việc, mình add các trường như: idSP (int), TenSP (string), Gia (double), SoLuong (int), TongTien (double) vào trong bảng table đã khai báo sau đó tiến hành load lại dữ liệu (hàm load_data xem lại bài trước).

Tiếp theo bạn xử lý nút mua hàng, lúc nảy mình đã mình đã đặt tên cho Command nút mua hàng do đó vào kích hoạt phần ItemCommand của DataList sản phẩm mới sử dụng được, ItemCommand cho phép bạn xử lý theo CommandName rất dễ chịu và tiện cho chúng ta quản lý các item. Bạn Click vào DataList sản phẩm và nhìn vào thanh thuộc tính làm theo hình.

ItemCommand trong Datalist

ItemCommand trong Datalist

<!--
protected void dlSanPham_ItemCommand(object source, DataListCommandEventArgs e)
    {
        if (e.CommandName == "ibtMuaHang")
        {
            if (Session["UserName"] == null)
            {
                Response.Redirect("Login.aspx");
            }
            else
            {
                int intidSP = int.Parse(dlSanPham.DataKeys[e.Item.ItemIndex].ToString());
                string strTenSP = ((LinkButton)e.Item.FindControl("lbtTenSanPham")).Text;
                float flGia = float.Parse(((Label)e.Item.FindControl("lbGia")).Text);
                int intSoLuong = 1;

                //Add vao gio hang

                foreach (DataRow row in tbGioHang.Rows)
                {//Kiem tr neu mat hang da co roi thi tang so luong len 1
                    if ((int)row["idSP"] == intidSP)
                    {
                        row["SoLuong"] = (int)row["SoLuong"] + 1;
                        goto GioHang;
                    }
                }
                tbGioHang.Rows.Add(intidSP, strTenSP, flGia, intSoLuong);
            GioHang:
                Session["GioHang"] = tbGioHang;

                Response.Write("<script>alert('Đã thêm vào giỏ hàng ^.*!...')</script>");
            }
            
        }
    }
-->

Đoạn code sau cho thấy được, nếu là CommandName đang xét là “ibtMuaHang” thì xử lý, muốn mua hàng bạn phải bắt người dùng đăng nhập để có thông tin cho đơn hàng chúng ta. Nếu Session["UserName"] mà có giá trị null thì mình Redirect đến trang đăng nhập.

Khi mình bấm vào nút mua hàng thì bạn có cách hiểu về hoạt động các biến như sau: intidSP là lấy giá trị key của DataList ép về kiểu int, strTenSP lấy từ control lbtTenSanPham ép về kiểu string, flGia giá lấy từ control lbGia ép về kiểu float, số lượng intSoLuong khai báo bằng 1 sau đó mình add chúng vào tbGioHang. Khi thành công thì thông báo.

Lúc này xem như đã xong phần trang hiển thị sản phẩm, bạn đi tiếp trang giỏ hàng GioHang.apspx, trang này mình cần xử lý rất nhiều, bạn nhìn giao diện mẫu hiển thị lên như sau và thiết kế một layout cho nó, ở đây sử dụng gridview.

Thông tin giỏ hàng đã chọn

Thông tin giỏ hàng đã chọn

Ở trang giỏ hàng bạn vẫn phải khái báo biến tỉnh giỏ hàng như ở trang show sản phẩm để lấy thông tin từ table trang kia truyền qua.

     static DataTable tbGioHang = new DataTable();

Tiếp theo mình sẽ load dữ liệu lên GridView hiển thị thông tin các sản phẩm chọn mua.

<!--
private void load_data()
    {
        if (Request.QueryString["ProID"] != null)
        {
            int idSP = int.Parse(Request.QueryString["ProID"]);
            DataTable dt = data.get("Select ProName,Price From Products where ProID=" + idSP).Tables[0];
            String TenSP = dt.Rows[0][0].ToString();
            int Dongia = int.Parse(dt.Rows[0][1].ToString());
            int Soluong = 1;
            ThemVaoGioHang(idSP, TenSP, Dongia, Soluong);
        }
        if (Session["GioHang"] == null)
        {
            Response.Redirect("GioHangRong.aspx");
        }
        tbGioHang = (DataTable)Session["GioHang"];
        string strnumber = tbGioHang.Compute("Sum(TongTien)", "").ToString();
        lbTongTien.Text = strnumber;
        gvGioHang.DataSource = tbGioHang;
        gvGioHang.DataBind();
    }
-->

Tiếp theo sau đây là hàng loạt chuổi các hàm liên quan với nhau nói chung cũng có chút phức tạp các bạn phải ghú ý hi.. Quên vấn đề nữa, các control trong trang giỏ hàng này là: GridView, lable tổng tiền, button mua tiếp, button xóa giỏ hàng, button cập nhật khi có thay đổi, và đặt hàng. Bạn nhận thấy trong hàm load dữ liệu có hàm thêm vào giỏ hàng, hàm này sẽ có tác dụng cho việc mua tiếp hàng mà không mất sản phẩm trong table. Sau đây là hàm thêm vào giỏ hàng.

<!--
public void ThemVaoGioHang(int idSP, string TenSP, int Dongia, int Soluong)
    {
        DataTable dt;
        if (Session["GioHang"] == null)
        {
            dt = new DataTable();
            dt.Columns.Add("idSP");
            dt.Columns.Add("TenSP");
            dt.Columns.Add("Gia");
            dt.Columns.Add("SoLuong");
            dt.Columns.Add("TongTien");
        }
        else
            dt = (DataTable)Session["GioHang"];
        int dong = SPdacotronggiohang(idSP, dt);
        if (dong != -1)
        {
            dt.Rows[dong]["SoLuong"] = Convert.ToInt32(dt.Rows[dong]["SoLuong"]) + Soluong;
        }
        else
        {
            DataRow dr = dt.NewRow();
            dr["idSP"] = idSP;
            dr["TenSP"] = TenSP;
            dr["Gia"] = Dongia;
            dr["SoLuong"] = Soluong;
            dr["TongTien"] = Dongia * Soluong;
            dt.Rows.Add(dr);
        }
        Session["GioHang"] = dt;
    }
-->

Bạn nhận thấy trong đó có phát sinh hàm lấy dòng, là SPdacotronggiohang, thật sự cũng chẳng biết đặt tên như thế nào :) nhưng hàm này sẽ trả về kiểu int là dòng hiện tại của table.

<!--
    public static int SPdacotronggiohang(int idSP, DataTable dt)
    {
        int dong = -1;
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            if (int.Parse(dt.Rows[i]["idSP"].ToString()) == idSP)
            {
                dong = i;
                break;
            }
        }
        return dong;
    }
-->
Eo ơi giỏ hàng ASP.Net

Eo ơi giỏ hàng ASP.Net

Tiếp đến mình sẽ xử lý các nút trong giỏ hàng của mình như sau, nút nào dễ làm trước :D bắt đầu từ nút mua tiếp, khi đã xem giỏ hàng nhưng chưa đồng ý người ta có thể mua tiếp thì mình cho khách đến Trang chủ.

<!--
    protected void ibtMuaTiep_Click(object sender, ImageClickEventArgs e)
    {
        Response.Redirect("~/TrangChu.aspx");
    }
-->

Tiếp theo là đặt hàng, nút này tương tự như mua tiếp mình sẽ dẫn khách đến trang đặt hàng.

<!--
    protected void ibtDatHang_Click(object sender, ImageClickEventArgs e)
    {
        Response.Redirect("~/DatHang.aspx");
    }
-->

Sau đó là nut xóa giỏ hàng, hii nút này còn dễ ác nữa.

<!--
    protected void ibtXoaGioHang_Click(object sender, ImageClickEventArgs e)
    {
        Session["GioHang"] = null;
        Response.Redirect("~/TrangChu.aspx");
    }
-->

Tiếp tục là một nút khó nhất trong cái đám nằm ngang đó là cập nhật giỏ hàng, khi mình thay đổi số lượng … trên gridview giỏ hàng thì muốn cập nhật thông số đó.

<!--
protected void ibtCapNha_Click(object sender, ImageClickEventArgs e)
    {
        try
        {
            DataTable dt = (DataTable)Session["GioHang"];
            foreach (GridViewRow r in gvGioHang.Rows)
            {
                foreach (DataRow dr in dt.Rows)
                {
                    if (int.Parse(gvGioHang.DataKeys[r.DataItemIndex].Value.ToString()) == int.Parse(dr["idSP"].ToString()))
                    {
                        TextBox t = (TextBox)r.Cells[3].FindControl("txtSoLuong");
                        if (Convert.ToInt32(t.Text) <= 0)
                            dt.Rows.Remove(dr);
                        else
                            dr["SoLuong"] = t.Text;
                        break;
                    }
                }
            }
            Session["Giohang"] = dt;
            Response.Redirect("~/GioHang.aspx");
        }
        catch (Exception)
        {
            Response.Write("<script>alert('Đã Phát Sinh Lỗi, Vui Lòng Kiểm Tra Lại!...')</script>");
        }
    }
-->

Còn một vấn đề quan trong nữa mà suýt nữa mình quên là nút xóa tại dòng nằm trong GridView giỏ hàng của mình, bấm vào dòng nào thì xóa dòng đó. :D Lúc này bạn chọn vào GridView và vào thanh thuộc tính chọn như hình, ở DataList thì có ItemCommand ở GridView thì có RowCommand.

RowCommand trong GridView giỏ hàng ASP.Net

RowCommand trong GridView giỏ hàng ASP.Net

Nút đó được code như sau:

<!--
protected void gvGioHang_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "btXoa")
        {
            int chiso = int.Parse(e.CommandArgument.ToString());
            try
            {
                DataTable dt = (DataTable)Session["GioHang"];
                dt.Rows.RemoveAt(chiso);
                Session["GioHang"] = dt;
                Response.Redirect("~/GioHang.aspx");
            }
            catch
            {
                Response.Redirect("~/GioHang.aspx");
            }
        }
    }
-->
3. Tạo đơn đặt hàng trong ASP.Net

Những gì gian khổ nhất cũng đã trãi qua, bây giờ có lẽ sẽ nhẹ hơn nhiều rồi, tạo tính năng đặt hàng.

Đặt hàng trong ASP.Net

Đặt hàng trong ASP.Net

Như trên bạn có thể thấy được có một gridview hiển thị cho người dùng biết được các sản phẩm mà họ đã chọn mua, và những thông tin cần thiết khi bạn giao dịch với khác hàng ….

Tương tự ở đây hiện thông tin giỏ hàng thị bạn phải khai báo biến.

    DataTable tbGioHang = new DataTable();

Trong phần PageLoad bạn khai báo các thành phần sau đây:

<!--
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            load_methodPay();
        }
        
        if (Session["GioHang"] == null)
        {
            Response.Redirect("GioHangRong.aspx");
        }
        
        int idkh = int.Parse(Session["CusID"].ToString());
        tbGioHang = (DataTable)Session["GioHang"];


        string strnumber = tbGioHang.Compute("Sum(TongTien)", "").ToString();
        lbTongTien.Text = strnumber;
        gvDatHang.DataSource = tbGioHang;
        gvDatHang.DataBind();
        txtThoiGianDat.Text = DateTime.Now.Date.ToString();
    }
-->

Ở đây có một chổ khác đó là có lấy IdKH mã khách hàng để bạn add vào trong đơn hàng, để lúc admin bạn quản lý sẽ biết người khách hàng nào đã đặt. Còn phương thức thanh toán thì load từ CSDL lên mà thôi bạn làm như sau:

<!--
    public void load_methodPay()
    {
        string sql = "select PayID,PayName from PayMethod where Visible = 1";
        drlPhuongThucThanhToan.DataSource = data.get(sql).Tables[0];

        drlPhuongThucThanhToan.DataTextField = "PayName";
        drlPhuongThucThanhToan.DataValueField = "PayID";
        drlPhuongThucThanhToan.DataBind();
    }
-->

Bạn chú ý dùng Điều khiển kiểm tra dữ liệu validation control trong ASP.Net để kiển tra thông tin nhập từ người dùng sau đó bạn tiến hành code nút đặt hàng.

<!--
protected void ibtDatHang_Click(object sender, ImageClickEventArgs e)
    {
        int idkh = int.Parse(Session["CusID"].ToString());
        if (Session["GioHang"] == null)
        {
            Response.Redirect("~/GioHangRong.aspx");
        }
        int ngay = int.Parse(DateTime.Now.Day.ToString());
        int thang = int.Parse(DateTime.Now.Month.ToString());
        int nam = int.Parse(DateTime.Now.Year.ToString());

        string[] dmy = (txtThoiGianGiao.Text).Split('/');
        int dd = int.Parse(dmy[0].ToString());
        int mm = int.Parse(dmy[1].ToString());
        int yy = int.Parse(dmy[2].ToString());


        string sql1 = "insert into Orders values ('" + idkh + "','" + drlPhuongThucThanhToan.SelectedItem.Value.ToString() + "',N'" + txtTenNguoiNhan.Text + "','" + nam + "/" + thang + "/" + ngay + "','" + yy + "/" + mm + "/" + dd + "',N'" + txtDiaChi.Text + "',0,N'" + txtGhiChu.Text + "','" + txtSDT.Text + "')";
        data.ExeCuteNonQuery(sql1);
        string sql2 = "select OrdID from Orders";
        int idDH = 0;
        foreach (DataRow r in data.get(sql2).Tables[0].Rows)
        {
            idDH = int.Parse(r[0].ToString());
        }
        if (tbGioHang.Rows.Count > 0)
        {
            foreach (DataRow r in tbGioHang.Rows)
            {
                int idSP = int.Parse(r["idSP"].ToString());
                int SoLuong = int.Parse(r["SoLuong"].ToString());
                double Gia = double.Parse(r["Gia"].ToString());
                string sql3 = "insert into OrderDetails values('" + idDH + "','" + idSP + "','" + Gia + "','" + SoLuong + "')";
                data.ExeCuteNonQuery(sql3);
            }
        }
        Session["GioHang"] = null;
        Response.Redirect("~/DatHangThanhCong.aspx");
    }
-->

Kết luận: Ở đây insert vào hai bảng đơn hàng và chi tiết đơn hàng luôn. Hix, pà con thông cảm bài viết dài quá đâm ra đau đầu muốn chết, phần trước còn giải thích được nhiều càng về sau đuối quá, thôi cứ làm được cái đã rồi từ từ mình tính nha mọi người! Quên nữa, thật ra đây cũng chỉ là phần demo tính năng giỏ hàng thôi bạn có thể phát triển thêm nhiều hơn nếu muốn mang ra sử dụng:D ví dụ như: cho khác hàng có thể sửa lại đơn hàng trong thời gian nhất định nào đó, hủy đơn hàng và phát triển về phương thức thanh toán online…. Chúc thành công.

CÁC CLASS CƠ BẢN TRONG GIỎ HÀNG DEMO PHÍA TRÊN

VN:F [1.9.22_1171]
Rating: 9.9/10 (13 votes cast)
Cách tạo và xử lý giỏ hàng trong ASP.Net, 9.9 out of 10 based on 13 ratings

Tags:

100 out of 100 based on 4297 user ratings
Nếu bạn thấy bài viết hữu ích, hãy nhấn +1 và các liên kết chia sẻ để website ngày càng phát triển hơn. Xin cám ơn bạn!

Nếu là khách, bạn phải đăng ký tài khoản và kích hoạt tài khoản để bình luận được hiển thị ở đây.
Thông tin kích hoạt gửi đến mail của bạn.

Tin mới hơn

Tin cũ hơn

Lên trên đầu