Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP C动态会话_C#_Asp.net_Session - Fatal编程技术网

C# ASP C动态会话

C# ASP C动态会话,c#,asp.net,session,C#,Asp.net,Session,试图建立一个非常简单的购物车。我在PHP中使用会话完成了这项工作,从我可以看出,这与ASP会话略有不同。首先,PHP会话只是服务器端cookie。在ASP C中,我发现当您关闭应用程序时,它们会自动重置。然而,这对我正在努力做的事情来说是好的。但我遇到了一个障碍,因为我不知道如何创建一个可以随时添加的动态会话 让我困惑的是,如果我只是用一块饼干来做这件事,那会有很大的不同: public ActionResult TestSession() { List<i

试图建立一个非常简单的购物车。我在PHP中使用会话完成了这项工作,从我可以看出,这与ASP会话略有不同。首先,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标记测试它们:

                        <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[myid]只保存它单击的内容的值。如果单击第一个,则MyID将为1,2,3,4,5,如果单击第二个,则会删除第一个,并执行11,12,13,14,15。。这与PHP会话完全相反。现在,如果我用ASP cookie来做这件事,我不确定我是否可以在cookie中插入一个列表,那么它会保持良好


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

会话只是一本字典。您没有创建新会话,没有动态会话之类的东西。当您执行Session[myIds]=ids时;如果字典中不存在一个新键,则在字典中创建该键,并将该值设置为ids。如果该键已存在于字典中,则将覆盖该值。这就是为什么你会有这样的行为

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

if (Session["myIds"] as List<int> != null)
{
    (Session["myIds"] as List<int>).AddRange(ids);
}
else
{
    Session["myIds"] = ids;
}
       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");
    }

ASP.NET中的会话是简单的字典键值存储。 所以,您所做的只是用新值覆盖值。 您可以简单地执行以下操作,而不是覆盖:

if (Session["myIds"] as List<int> != null)
{
    (Session["myIds"] as List<int>).AddRange(ids);
}
else
{
    Session["myIds"] = ids;
}
       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[myid]是否正是您期望的列表,并且不为null,然后您只需将您的id添加到列表中


我建议你读一下。

啊!好的,谢谢!回答得很好。但这是一个动态会话,不是吗?不管怎样,谢谢你,伙计!不,正如我所说,没有动态会话。每个会话都有一个会话对象。会话状态存储在服务器内存中,或者可以为数据库进行配置,服务器知道哪个会话属于哪个连接,因为有一个包含会话ID的cookie,或者如果启用了无cookie会话,那么它会将会话ID存储在URL中。是的,但动态只是意味着它不是静态的,通过使用您的方法,从定义上讲,这是动态的,因为我们在声明后会添加它。好吧,这很公平。但动态会话或静态会话不是您经常听到的短语。你只是简单地把它称为会话。是的,我想我没有正确理解会话,但是感谢你的帮助。是的,第一个人已经说过了,所以我必须把它给他,但是投票给你的答案,谢谢你的参考。我会调查的。