2012-03-08 108 views
11

我有一个asp.net项目后面的c#代码。我有一个名为GlobalVariable的静态类,用于存储一些信息,例如当前选定的产品。Asp.net会话变量

但是,我看到当有两个用户使用该网站时,如果更改了所选产品,如果更改为每个人。静态变量似乎对大家都是共同的。

我想创建(从C#代码)某种类型的会话变量仅用于C#代码,但不仅仅是从页面,而是从任何类。

+0

静态变量是在整个应用程序进行访问。会话用于在用户登录和注销内存储和访问变量。使用数据库让您的变量超出您的会话和应用程序。要在多个应用程序之间共享数据,请使用分布式缓存并将[ASP.NET会话](http://www.alachisoft.com/ncache/session-index.html)存储在缓存中。 – 2015-12-21 07:52:55

回答

22

是的静态变量是由整个应用程序共享的,它们决不是用户/会话专用的。

要从非页面类访问Session对象,应该使用HttpContext.Current.Session

+0

哇,太简单了^^谢谢。 – Amaranth 2012-03-08 19:00:30

+3

@Mathieu请记住检查是否为空,因为并不总是为每个请求创建会话。例如,简单处理程序(如.ashx文件)不会默认设置为创建会话对象。 – 2012-03-08 19:10:13

+0

Apropos,http://stackoverflow.com/questions/1382791/asp-net-what-to-do-if-current-session-is-null/1382811#1382811 – driis 2012-03-08 19:55:45

8

GlobalVariable是一个误导性的名字。不管它叫什么,如果每个会话都不应该是static。你可以做这样的事情,而不是:

// store the selected product 
this.Session["CurrentProductId"] = productId; 

你不应该试图让Session收集全局访问无论是。相反,只需传递您需要的数据,并在适当情况下使用Session进行设置。

以下是在MSDN上使用session storage in ASP .NET的概述。

+0

谢谢你提供了一个如何使用Session的例子。 – Ernest 2014-01-15 20:22:50

7

你有点回答你自己的问题。答案在会话变量中。在您的GlobalVariable类中,可以放置由会话变量支持的属性。

例子:

public string SelectedProductName 
{ 
    get { return (string)Session["SelectedProductName"]; } 
    set { Session["SelectedProductName"] = value; } 
}