Bhaskar
Bhaskar

Reputation: 1690

Populate dropdownlist - avoid multiple database calls

I am using a Asp.Net MVC application.

In the following code how can I avoid the two database calls for populating a dropdown?

[HttpGet]
public ActionList Upload(){

// do something
//For populating drop downlist take data from db

Return View("Upload");

}

[HttpPost]
public ActionList Upload(){

//do something
//again take data from db for populating dropdown

Return View("Upload");

}

Any other way than jQuery ajax method? Thanks

Upvotes: 0

Views: 1004

Answers (2)

Russ Clarke
Russ Clarke

Reputation: 17909

It depends on the size of the data and how often it's likely to change, but a common solution is just to use the HttpContext's Cache property.

public List<items> GetDropdownlistItems()
{
    string cacheKey = "dropdownlistItems";

    if (HttpContext.Current.Cache[cacheKey] != null)
    {
        return (List<items>)HttpContext.Current.Cache[cacheKey];
    }

    var items = GetItemsFromDatabase();

    HttpContext.Current.Cache.Insert(cacheKey, items, null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration);

    return items;
}

Upvotes: 5

BonyT
BonyT

Reputation: 10940

I tend to cache data that is rarely changed such as this.

Checkout EntLibs Caching Application Blocks.

You can load all data into the cache on first use, and set an expiry time depending on how quickly you want changes in the db to be made effective.

Basically, add a layer between your Controller and the Database, that runs code something like this:

        MyData myData = null;
        myData = (MyData )cacheManager.GetData("myData");

        if (myData == null)
        {
            myData = dataProvider.GetData();
            cacheManager.Add("myData", myData, CacheItemPriority.Normal, null, timeToExpire);
        }

        return myData;

Where myData is the data you need for a dropdown.

Upvotes: 1

Related Questions