【问题标题】:does Session.Clear(); clears all sessions dataSession.Clear();清除所有会话数据
【发布时间】:2017-08-22 10:28:06
【问题描述】:

我想清除一个会话数据,但它正在清除两个会话数据。下面是我的 2 个用于清除会话数据的 MVC 操作方法。

1)

public int Clearsesson()
        {
            int i = 0;
            List<Wish_Product> products = new List<Wish_Product>();
            if (**Session["WishItem"]** != null)
            {              
                Session.Clear();
                i = 1;
            }
            else
            {
                i = 0;
            }
            return i;

        }

2)

 public int Clearsesson2()
        {
            int i = 0;
            List<Cart_Product> products = new List<Cart_Product>();
            if (**Session["CartItem"]** != null)
            {
               // Session.Remove("CartItem");
                Session.Clear();
                i = 1;
            }
            else
            {
                i = 0;
            }
            return i;

        }

所以像这样我将数据存储在两个会话中,但是当我运行这个 asp.net MVC Action 方法来清除一个会话数据时,它也会自动清除第二个会话数据。

为什么会这样?请告诉我为什么会这样。

或者我该怎么做才能解决这个问题?

【问题讨论】:

  • 1) Session["WishItem"] 2) Session["CartItem"] 这是两个 Sessions

标签: asp.net-mvc session


【解决方案1】:

简短的回答是,在当前集合中。

根据 ASP.NET 文档,HttpSessionState.Clear 方法从当前活动的会话状态集合中删除所有键和值(它不会破坏用户的会话状态库),因此 Session["WishItem"] &Session["CartItem"] 值在执行该方法时从集合中一起清除,但会话状态库保持活动状态

在这种情况下有 2 个不同的会话集合键,实际上它们都使用相同的会话状态。要清除单个会话数据,有两种不同的方法:

1) 使用Session.Remove 删除会话密钥。

Session.Remove("WishItem");

2) 根据其键将null 值分配给会话状态。

Session["WishItem"] = null;

它们的区别在于前者同时删除键和值,使其不再作为键值对出现在会话集合中,后者用指定的键覆盖当前集合值但键名保持不变。

因此,您可以单独删除每个会话数据,而无需像这样清除另一个会话密钥:

public int ClearSession()
{
    int i = 0;
    // other code logic
    if (Session["WishItem"] != null)
    {              
        // only WishItem key has cleared
        Session.Remove("WishItem");
        i = 1;
    }

    // other code logic
}

public int ClearSession2()
{
    int i = 0;
    // other code logic
    if (Session["CartItem"] != null)
    {              
        // only CartItem key has cleared
        Session.Remove("CartItem");
        i = 1;
    }

    // other code logic
}

请注意,始终为每个经过身份验证的用户分配一个会话状态库,因此使用 Session.Clear 会删除当前用户会话集合中存储的所有现有键值对(不影响其他用户的会话状态)。

【讨论】:

  • 首先感谢您非常详细地回答 :) 现在我正在使用“Session[”WishItem”] = null”方法使其为空,但是当我运行我的项目时,我在视图中收到此错误/异常:-“System.NullReferenceException:对象引用未设置为对象的实例。”在视图中的这部分代码中 => "@if (Session.Count > 0 && Session["WishItem"].ToString() != null)"
  • 您可以在 ToString:@if (Session.Count &gt; 0 &amp;&amp; (Session["WishItem"] ?? String.Empty).ToString()) 之前使用空值合并来解决它,或者简单地进行空值检查:@if (Session.Count &gt; 0 &amp;&amp; Session["WishItem"] != null)
  • 是的,它现在可以工作了......再次非常感谢您解决了我的问题。 :)
猜你喜欢
  • 1970-01-01
  • 2015-10-02
  • 2015-08-14
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
相关资源
最近更新 更多