我正在开发一个ASP.NET MVC 4应用程序。 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; }
}
我使用该静态变量来检查登录用户是否具有自定义授权过滤器中菜单/控制器的权限。
单个用户登录时工作正常,但当两个或多个用户登录时,全部搞砸了,我的意思是显示错误页面(“您无法访问此页面”)对拥有菜单/控制器权限的用户。
在我读完这篇文章后,我才意识到这是造成所有麻烦的静态变量:
The static variables will be shared between requests. Moreover they will be initialized when application starts, so if the AppDomain, thus application gets restarted, their values will be reinitialized.
所以我需要替换这个静态变量。有人有什么建议吗?
答案 0 :(得分:1)
我的问题是,你为什么要使用静态变量?您想在整个应用程序中共享值吗?在这种情况下,您可以更好地使用session
。
<强>更新强>
将lst
假设为List
的非静态UserMenu
。然后,您可以使用以下方法将其存储在会话中,并随时获取它。
存储
Session["usemenulist"] = lst
;
将其取回
try
{
lst = (List<UserMenu>)Session["usemenulist"];
}
catch
{
}
注意强>
如果您从数据库获取值,则首次将其加载到List
,然后您可以查询数据库以便随时从数据库中获取它,而不是将其存储在会话中。 (除了Session
之外,这是另一种选择,如果你愿意,也可以尝试这种方式。)
答案 1 :(得分:1)
您仍然可以使用静态字段,该字段是提供对会话变量的访问的属性。
public static List<UserMenu> UserMenus
{
set
{
Session["UserMenus"] = value;
}
get
{
return Session["UserMenus"] == null ? new List<UserMenu>() : (List<UserMenu>) Session["UserMenus"];
}
}
为了在使用会话状态服务器(或sql server)的Web场上工作,您需要将[Serializable]属性放在UserMenu之上。
我不认为,这种方式你需要非常修改你的代码。