I am using a database driven menu for navigating to different pages. Is there a way to avoid reloading of the menu every time a page is called. I tried different method but all of them makes call to database everytime
My first try was as a usercontrol. Inside the usercontrol I had the menu. I had the menu databind inside a !(IsPostBack) condition, but still it kept binding itself. I tried binding it on onnit event too. My second attempt was on masterpages. I had the menu in masterpage and it kept binding the menu everytime a page is requested or a post back is made.The third try was using an interface which I extended like this on the partial class definition
public partial class Order_Query_Report : System.Web.UI.Page, CustomParent.IPageToIncludeHeaderFooter
The header was coming through that interface which internally contains a usercontrol (which in turn contains the menu).
None of them helped me to achieve what I was looking for.
Another approach was to have two iframes and having header on top and content on bottom. I had the menu fire javascripts in order to load the pages on bottom iframe. But it had significant drawbacks. The URL on top of browser is always constant (the url of header). Secondly, there were lots of issues in terms of authentication, disconnected communication etc.
It will be great if someone can advice me how to achieve a header menu which doesn't rebind everytime.
I tried ajax , but that also didn't help.Every time there' s a redirect, the menu binds itself
This can be resolved by the server side programming. For example, you can store the database data into a server side cache, then serve the request with the server side cached data.
For example, the following .NET MVC code is to get the product categories from the server cache :
public static List ProductCategories_Cached
{
get
{
if ((List)(HttpContext.Current.Cache["Cache:ProductCategory"]) == null)
{
using (myEntities db = new myEntities())
{
List staticData = db.ProductCodes.ToList();
HttpContext.Current.Cache.Insert("Cache:ProductCode", staticData, null, DateTime.MaxValue, TimeSpan.FromDays(1), CacheItemPriority.High, null);
}
}
return (List)(HttpContext.Current.Cache["Cache:ProductCode"]);
}
}
public static ProductCategory GetProductCategories(string pCode)
{
return ProductCategories_Cached.FirstOrDefault(p => p.Pcode == pCode);
}
Usually, when I run into a situation like this - where the
items in the menu arent going to change very often - I set up a small caching
utility, to perform and hold the dataset for the menu's information, and bind
to the class - rather than directly to the database. Just store the
returned dataset inside a CacheObject, then before your menu checks it, find
out if the CacheObject is empty, if it is fill it, then bind to it, if it's not
empty, use whats in it.
This will keep you from making calls to the Database every
single time the menu is hit, and it'll perform MUCH better for you.
"sel.options.length = 0;\n";
If your question is related to the topic of this post, you can post your question to this page by clicking the "Post a reply" button at left;
If your question is related to the Drop Down Menu, click:
Ask new question: Drop Down MenuOtherwise navigate to one of the following forum categories, and post your question there.
##