ASP.NET WebForm 06 常用对象2

Posted by 古承风 on July 17, 2019

1. Session 对象

1.1. 使用背景

  • ViewState对象无法实现不同页面共用一个变量
  • 本技术是为实现不同页面之间的信息共享

1.2 典型应用-一次请求中数据在前台

  • 使用session实现简单的购物车

Session 可以实现跨页面信息传递,服务器为每一个用户创建一个Session,直至用户关闭浏览器,或者响应本用户访问的服务器线程关闭,或者达到时间限制
Session的时间限制默认为20分钟,可以自定义

在VS中新建一个空ASP.NET 项目,分别创建Default.aspx以及ShoppingCart.aspx两个Web窗体,其中Default.aspx的代码如下所示:


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Demo04.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:CheckBox ID="ckbProduct1" runat="server" Text="衬衣"/>
            <asp:CheckBox ID="ckbProduct2" runat="server" Text="外套"/>
            <asp:CheckBox ID="ckbProduct3" runat="server" Text="帽子"/>
            <asp:CheckBox ID="ckbProduct4" runat="server" Text="裤子"/>
            <asp:CheckBox ID="ckbProduct5" runat="server" Text="手套"/>

            <asp:Button ID="btnAddToCart" runat="server" Text="将所选商品添加到购物车" OnClick="btnAddToCart_Click" />

            <asp:Button ID="btnShowCart" runat="server" Text="显示购物车" OnClick="btnShowCart_Click" />

        </div>
    </form>
</body>
</html>


ShoppingCart.aspx的代码如下所示:


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ShoppingCart.aspx.cs" Inherits="Demo04.ShoppingCart" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>

        </div>
    </form>
</body>
</html>


Default.aspx.cs的代码如下所示:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo04
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                List<string> cart = new List<string>();

                Session["Cart"] = cart;

            }
        }

        protected void btnAddToCart_Click(object sender, EventArgs e)
        {
            foreach(Control item in form1.Controls)
            {
                if(item is CheckBox)
                {
                    CheckBox ckd = (CheckBox)item;

                    if(ckd.Checked)
                    {
                        ((List<string>)Session["cart"]).Add(ckd.Text);
                    }
                }
            }

            this.btnAddToCart.Text = "添加成功";
        }

        protected void btnShowCart_Click(object sender, EventArgs e)
        {
            Response.Redirect("ShoppingCart.aspx");
        }
    }
}

ShoppingCart.aspx.cs的代码如下所示:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo04
{
    public partial class ShoppingCart : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //取出对象集合,遍历后显示
            List<string> cart = (List<string>)Session["cart"];
            string info = string.Empty;

            foreach(string item in cart)
            {
                info += item + "  ";
            }

            Response.Write("您选的商品为:" + info);
        }
    }
}


将Default.asxp设置为起始页,则运行项目后可以得到如下效果:

1.3 Session对象的使用场景

  • 当用户第一次打开浏览器并登陆网页,浏览器中并没有任何SessionID
  • 用户把当前网页全部关闭,再次登陆网页,前面的SessionID就会丢失
  • 用户使用不同的浏览器登陆网页,不同浏览器之间的Session无法共享

1.4 Session的属性和方法

属性 说明
SessionID 包含唯一的用户会话标识
TimeOut 用户设置用户超时时间,单位为分钟
方法 说明
Add(string name,object value) 添加键值对
Remove(string name) 根据键删除指定值
Clear() 从会话状态集合中移除所有的键和值
Abandon() 结束Session,取消当前会话