C# 静态变量的替换
我正在开发一个ASP.NETMVC4应用程序C# 静态变量的替换,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我正在开发一个ASP.NETMVC4应用程序userMenus是一个静态变量,用户每次登录时都会加载该变量 public class MenuCL { public static List<UserMenu> userMenus = new List<UserMenu>(); // the static variable } public class UserMenu { public decimal MenuID { get; set; } p
userMenus
是一个静态变量,用户每次登录时都会加载该变量
public class MenuCL
{
public static List<UserMenu> userMenus = new List<UserMenu>(); // the static variable
}
public class UserMenu
{
public decimal MenuID { get; set; }
public string MenuName { get; set; }
public string Controller { get; set; }
public bool Permission { get; set; }
}
公共类菜单
{
public static List userMenus=new List();//静态变量
}
公共类用户菜单
{
公共十进制MenuID{get;set;}
公共字符串菜单名{get;set;}
公共字符串控制器{get;set;}
公共bool权限{get;set;}
}
我使用该静态变量来检查登录用户是否有权访问自定义授权筛选器中的菜单/控制器
当一个用户登录时,它可以正常工作,但当两个或更多用户登录时,一切都会一团糟,我的意思是错误页面(“您无权访问此页面”)会显示给具有菜单/控制器权限的用户
直到现在我才意识到是静态变量造成了所有的麻烦,在我读了这篇文章之后:
静态变量将在请求之间共享。此外,它们将在应用程序启动时初始化,因此如果AppDomain(因此应用程序)重新启动,它们的值将重新初始化。
所以我需要替换这个静态变量。有人有什么建议吗?我的问题是,为什么要使用静态变量?是否要在整个应用程序中共享这些值?在这种情况下,您可以更好地使用
会话
已更新
假设lst
是UserMenu
的非静态列表。然后,您可以使用以下方法将其存储在会话中,并在需要时随时获取bak
储存
会话[“usemenulist”]=lst
把它拿回来
try
{
lst = (List<UserMenu>)Session["usemenulist"];
}
catch
{
}
试试看
{
lst=(列表)会话[“usemenulist”];
}
抓住
{
}
注意
如果您是从数据库中获取值并首次将其加载到列表中,则可以随时查询数据库以从数据库中获取值,而不是将其存储在会话中。(这是除了会话之外的另一个选项,如果您愿意,也可以尝试这种方式。)您仍然可以使用静态字段,它是提供对会话变量访问的属性
public static List<UserMenu> UserMenus
{
set
{
Session["UserMenus"] = value;
}
get
{
return Session["UserMenus"] == null ? new List<UserMenu>() : (List<UserMenu>) Session["UserMenus"];
}
}
公共静态列表用户菜单
{
设置
{
会话[“用户菜单”]=值;
}
得到
{
返回会话[“用户菜单”]==null?新建列表():(列表)会话[“用户菜单”];
}
}
为了在使用会话状态服务器(或sql server)的web场上实现这一点,您需要将属性置于UserMenu的顶部
我不认为,通过这种方式,您需要非常多地修改代码。使其成为非静态的?为什么它首先是静态的?@nvoigt我使用该静态变量来检查用户是否具有控制器/菜单的权限。所以我需要userMenus
一直保持到用户注销,这样每当有控制器请求时,我就可以签入我的授权过滤器。是的,我需要在我的应用程序中使用它。我如何使用会话完成它?我是否可以将列表用户菜单
存储在会话中,并在需要时将其作为列表检索?