最进在用Cookie的时候总是不顺,出现了一个实在让人不理解的问题:
当给Cookies赋值并设置过期时间后后再访问Cookie,没什么问题,包括访问他的键,和Cookie的数量都没问题。如下面的代码。
Response.Cookies["userInfo"]["userName"] = "mike";
Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
Response.Cookies.Count;
string [] keys = Response.Cookies.AllKeys;
foreach(string key in keys )
{
   Response.Write(key +"<br>");
}可是当指定的Cookie中已经有值了的时候,就是在第一次执行页面时发放了Cookie,当第二在执行这个页面时不会再发放Cookie值,而是访问第一次执行页面时所发放的Cookie的值。此时访问
Response.Cookies.Count;
Response.Cookies.AllKeys;
会出现问题,Count为0 ,AllKeys数组为空!而打开Cookie文件看,里面确实有值,而且是第一次执行页面是所发放的值。这里不知道为什么Count为0 ,AllKeys数组为空!?迷惑!

解决方案 »

  1.   

    "第二在执行"是在新的页面中吗?是不是放到了postback或者callback中限制了啊
      

  2.   

    恩是的啊,放到了postback里面了的!.
      

  3.   

    同意一楼,你可能是第二次没有运行到输出cookie
      

  4.   

    大侠们,还是不行啊.代码如下.帮住休正下好吗?
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using KKZK.proc;namespace KKZK.Controls
    {
        public partial class cart : System.Web.UI.UserControl
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                string pro_id = Request.QueryString["pro_id"];
                if (pro_id != string.Empty && pro_id != null)
                {
                    string sql = "select pro_id ,pro_name ,pro_price,pro_factory from Product where pro_id=" + int.Parse(pro_id);
                    DataTable table = SelectSouse(sql);
                    CookieCartSouse(table, pro_id);
                }            if (!IsPostBack)
                {
                    Norms[] list = (Norms[])ShowCookieCart();
                    gv_cart.DataSource = list;
                    gv_cart.DataBind();
                }
                //productInfo();
            }        /// <summary>
            /// 提取数据记录
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <returns>返回数据表对象</returns>
            public DataTable SelectSouse(string sql)
            {
                DataTable table = (new Connect()).ReadByDataTable(sql);
                return table;
            }        /// <summary>
            /// 将提取的数据记录添加到二维Cookie数组中。
            /// </summary>
            /// <param name="table">数据表对象</param>
            /// <param name="productId">第一维的变量</param>
            public void CookieCartSouse(DataTable table, string productId)
            {
                //表示CookieCart里有商品
                if (Response.Cookies.Count > 0)
                {
                    //取得Cookie的键组
                    foreach (string key in Response.Cookies.AllKeys)
                    {
                        //Cookie的键与接收的商品的ID相同,将商品数量加一.
                        if (key == productId)
                        {
                            int num = int.Parse(Response.Cookies[productId]["pro_num"]) + 1;
                            Response.Cookies[productId]["pro_num"] = num.ToString();
                            return;
                        }
                    }
                }
                Response.Cookies[productId]["pro_id"] = table.Rows[0][0].ToString();
                Response.Cookies[productId]["pro_name"] = table.Rows[0][1].ToString();
                Response.Cookies[productId]["pro_num"] = "1";//商品购买的数量默认是1
                Response.Cookies[productId]["pro_price"] = table.Rows[0][2].ToString();
                Response.Cookies[productId]["pro_factory"] = table.Rows[0][3].ToString();
                Response.Cookies[productId].Expires = DateTime.Now.AddDays(1);//设置过期时间
            }        /// <summary>
            /// 读取Cookie中的值将其增加到ArrayList中
            /// </summary>
            /// <returns>返回Norms类属性数组</returns>
            public Norms[] ShowCookieCart()
            {
                ArrayList arrList = new ArrayList();
                if (Response.Cookies.Count > 0)
                {
                    string[] strArray = Response.Cookies.AllKeys;
                    foreach (string key in strArray)
                    {
                        Norms nw = new Norms();
                        nw.pro_id = int.Parse(Response.Cookies[key]["pro_id"].ToString());
                        nw.pro_name = (string)Response.Cookies[key]["pro_name"].ToString();
                        nw.pro_num = int.Parse(Response.Cookies[key]["pro_num"].ToString());
                        nw.pro_price = float.Parse(Response.Cookies[key]["pro_price"].ToString());
                        nw.pro_up = float.Parse(Response.Cookies[key]["pro_price"].ToString()) * int.Parse(Response.Cookies[key]["pro_num"].ToString());
                        nw.pro_factory = (string)Response.Cookies[key]["pro_factory"].ToString();
                        arrList.Add(nw);
                    }
                    return (Norms[])arrList.ToArray(typeof(Norms));
                }
                return null;
            }    }
    }
      

  5.   

    在提取COOKIE的值时,总是只提取最进传进去的一条数据.