.Net Session Scoped变量?

时间:2011-01-25 15:49:19

标签: c# asp.net-mvc linq session asp.net-mvc-2

我是.net的新手,我正在使用 MVC2 + linQ和C#

我想知道是否可以使用会话范围的变量或clases以及如何做到这一点? 我需要将它存储在会话对象中吗?或者只是声明一个全局变量?

我需要这个来存储来自不同sql表的数据关联到登录用户

提前致谢

5 个答案:

答案 0 :(得分:3)

是的,您应该能够使用Controller的操作方法中的Session对象来存储和检索会话数据。

Session["MyData"] = myData;
MyDataType myData = (MyDataType)Session["MyData"];

显然要小心你正在存储的对象的大小以及如何处理会话数据,即在进程,SQL Server或应用程序服务器中。如果您没有将会话数据存储在内存中,则需要确保它是可序列化的。

答案 1 :(得分:2)

是的,因为它是会话范围的数据,会话将放到放置数据的地方,这没有任何问题。

我能看到的唯一不利的一面是,如果会话超时,你就会丢失这些数据 - 所以如果它是你要保留的数据(而不是只读或只是临时数据),你可能想要保存在数据库中显示状态。

答案 2 :(得分:1)

为每个请求重新创建控制器,因此如果您想在每个会话中存储某些内容,是的,您需要将其存储在Session["key"]中。

另一个可能有意义的选项(取决于你正在做的事情)将是使用DI容器通过构造函数注入会话范围的变量,并使用DI工具配置它们的范围为每个会话。

答案 3 :(得分:1)

简短的回答是,不应使用全局变量 - 它们仅在单个请求期间工作。所以你必须使用Session属性。

但你应该避免使用它恕我直言。

如果您希望将自定义数据与登录用户相关联,则始终可以使用UserData member of the forms ticket

编辑:我不是来自英语国家,所以有时我会使用“不能”当我应该使用“不应该”。为了避免更多的贬低,让我们在这里做一些事情 - 当然你可以在web,多线程应用程序中使用全局变量。这不是很聪明,因为所有引用的对象都会在请求结束时丢失。但随意去做。

答案 4 :(得分:1)

正如其他人所说,语法很简单,如果需要,您可以简单地将Session视为散列图或字典。

Session["userData"] = userData;
UserInfo userData = Session["userData"] as UserInfo;

注意(因为你是C#的新手)," as"关键字基本上是一个可以为空的演员;如果强制转换失败,则userData变量将设置为null。

为了额外的功劳,(并且取决于您的应用程序的要求),您可以将所有数据访问包装在DAO或类似于存储库的对象中,并让该对象使用Session。数据存储的位置是控制器本身不需要的实现细节;从Session中获取它数据库(或xml文件,或静态内存中的对象,或其他)应与控制器无关(其主要工作应该是控制应用程序流)。