会话像原始类型一样传递?

Session is passing like a primitive type?

提问人:crazyPen 提问时间:5/20/2018 最后编辑:crazyPen 更新时间:5/20/2018 访问量:60

问:

我有一个 MVC Core Dotnet 应用程序,基本上我想加载会话数据的视图,但在页面加载后删除会话。我的代码有效,但我不明白为什么

public IActionResult Charge(string stripeEmail, string stripeToken, int totalPrice){
    //some stripe code that went here...

    var cart = HttpContext.Session.GetCart();
    ClearSession();
    return View(cart);
}

protected void ClearSession(){
    //creates a new instance if cart doesnt exist otherwise returns it
    var cart = HttpContext.Session.GetCart();

    //clears the items from the collection using .Clear() ...
    cart.RemoveAll();
    HttpContext.Session.SetCart(cart);
}

当代码被放置在像这样的新方法中时,它就会起作用。但是如果我用相同的方法放置它,它就不起作用了。我很惊讶地将它放在一种新方法中,因为它违背了我对按值传递如何处理对象类型的理解。(将传递对象的位置)。当我在新方法中清除 Item 列表时,它的作用就像是对象的副本。

为什么这段代码有效?

C# .NET ASP.NET-MVC 按引用传递

评论

1赞 Chetan 5/20/2018
当您在方法中执行此操作时,它会创建会话中任何内容的本地副本,并将其传递给视图。在方法中,将创建并修改另一个本地副本,并将其保存回会话。这就是它的工作原理。var cart = HttpContext.Session.GetCart();ChargeClearSession
0赞 Chetan 5/20/2018
若要获得所需的行为,需要创建一个空集合,并在清除会话后将 is 保存到会话。var cart = HttpContext.Session.GetCart();

答: 暂无答案