I am trying to create a menu dynamically the first time a user accesses my site as shown in the code below. The problem is that my static global variables lifetime is longer than execution time so if a users permissions as to which menu items they can access changes and execution ends and then starts again the old menu may still be stored in MainMenu and MenuGenerated=1 so they will see the old menu as the new one will not be generated.
Is there a different type of variable that I can use to solve this problem or is there a different way of doing this?
public static class Globals
{
public static List<MenuItem> MainMenu = new List<MenuItem>();
public static Int32 MenuGenerated = 0;
}
public partial class SiteMaster : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
List<MenuItem> MainMenu = Globals.MainMenu;
if (Globals.MenuGenerated == 0)
{
//set MenuGenerated=1
//Generate menu items based on permissions stored in SQL tables
//store in global MainMenu
}
foreach (MenuItem i in MainMenu)
{
NavigationMenu.Items.Add(i);
}
}
}
Static variables are going to be shared between users, so that's not an appropriate place to cache a menu that's a per-user value.
You can use
Session
to store data in a context that will be shared between all of the requests of that user in their session.If you want to store the data beyond the scope of the user's current session (since you're just caching a menu, I wouldn't expect you to need anything other than the session) you could either back your session with a database, instead of using an in-memory session implementation, or explicitly store the data in a database (without using
Session
). Of course, since the idea here is you trying to cache values, that wouldn't appear to be helpful in this context.