ASP C#动态会话

时间:2014-11-22 19:06:11

标签: c# asp.net session

尝试构建(非常)简单的购物车。我在PHP中使用Sessions做到了这一点,我可以说它与ASP Sessions有点不同。对于初学者来说,PHP会话只是服务器端的cookie。在ASP C#中,我发现当你关闭应用程序时它们会重置。然而,这对我想做的事情很好。但是我遇到了障碍,因为我无法弄清楚如何创建一个我可以随时添加的动态会话。

令我感到困惑的是,如果我用饼干做到这一点,那将会有很大不同:

    public ActionResult TestSession()
    {
        List<int> ids = new List<int> { 1, 2, 3, 4, 5 };
        Session["myIds"] = ids;

        return RedirectToAction("Index");
    }

    public ActionResult TestSession2()
    {
        List<int> ids = new List<int> { 11, 12, 13, 14, 15 };
        Session["myIds"] = ids;

        return RedirectToAction("Index");
    }

现在我在MVC视图中用一个简单的标签测试这些:

                        <a href="@Url.Action("TestSession", "Products")" class="AddLink"><button class="btn btn-default"> Add to Cart </button></a>    
                        <a href="@Url.Action("TestSession2", "Products")" class="AddLink"><button class="btn btn-default"> Add to Cart </button></a>    

带回让我感到困惑的一点是,当我调试时,Session [“myIds”]只保存它点击的值。如果我点击第一个,那么myIds将是1,2,3,4,5如果我点击第二个,那么它将删除第一个并且执行11,12,13,14,15 ..这是完全的与PHP会话相反。现在,如果我使用ASP cookie(不确定我是否可以将一个List插入到cookie中),那么它会很好。

所以我的问题是如何创建一个我可以简单添加但不会删除之前的值的会话?我确实尝试创建一个全局会话,但不太明白如何做到这一点。

2 个答案:

答案 0 :(得分:2)

Session简直就是一本字典。您没有创建新会话(没有动态会话)。当您执行Session["myIds"] = ids;时,您需要在字典中创建新密钥(如果它不存在)并将值设置为ids。如果密钥已存在于字典中,则您将覆盖该值。这就是为什么你会得到你所看到的行为的原因。

如果您想将元素添加到会话中存储的现有列表中,它就是这样的:

if (Session["myIds"] as List<int> != null)
{
    (Session["myIds"] as List<int>).AddRange(ids);
}
else
{
    Session["myIds"] = ids;
}

答案 1 :(得分:1)

ASP.NET中的Session是简单的字典 - 键值存储。 那么你在做什么只是用新的价值覆盖价值。 而不是覆盖你可以简单地做这样的事情:

       public ActionResult TestSession()
    {
        List<int> ids = new List<int> { 1, 2, 3, 4, 5 };
        if (Session["myIds"] as List<int> != null)
        {
            (Session["myIds"] as List<int>).AddRange(ids);
        }
        else
        {
            Session["myIds"] = ids;
        }

        return RedirectToAction("Index");
    }

    public ActionResult TestSession2()
    {
        List<int> ids = new List<int> { 11, 12, 13, 14, 15 };
        if (Session["myIds"] as List<int> != null)
        {
            (Session["myIds"] as List<int>).AddRange(ids);
        }
        else
        {
            Session["myIds"] = ids;
        }
        return RedirectToAction("Index");
    }

您必须首先检查Session["myIds"]是否与您期望的完全相同(List<int>)且不为空,然后您只需将您的ID添加到列表中。

我建议阅读C# collections