Кэшируйте выпадающие элементы в бритве MVC.Как это сделать? - PullRequest
3 голосов
/ 20 марта 2012

Как я могу кэшировать свои элементы и значения для выпадающего списка в MVC?

Есть ли способ сделать это?

Я делаю это в контроллере.

Пример кода: .......

    public ActionResult Index()
    {
        RegionTasks regionTasks = new RegionTasks();
        ViewBag.Region = GetRegions();}

Мой контроллер работает следующим образом.

 [OutputCache(Duration = 10, Location = System.Web.UI.OutputCacheLocation.Server)]
    private IEnumerable<SelectListItem> GetRegions()
    {
        RegionTasks regionTasks = new RegionTasks();
       return regionTasks.GetRegions();
    }

Я протестировал, и он не кэширует элемент для региона.

Как я могу это сделать?

Ответы [ 2 ]

8 голосов
/ 20 марта 2012

Атрибут OutputCache используется в действиях контроллера для кэширования полученного результата.Это строго не влияет на другие методы.

Если вы хотите кэшировать пользовательские объекты, вы можете использовать HttpContext.Cache:

private IEnumerable<SelectListItem> GetRegions()
{
    var regionTasks = HttpContext.Cache["regions"] as IEnumerable<SelectListItem>;
    if (regionTasks == null)
    {
        // nothing in the cache => we perform some expensive query to
        // fetch the result
        regionTasks = new RegionTasks().GetRegions();

        // and we cache it so that the next time we don't need to perform
        // the query
        HttpContext.Cache["regions"] = regionTasks;
    }

    return regionTasks;
}

regionTasks теперь кэшируется под ключом regions и доступен из любой точки вашего ASPПриложение .NET, которое имеет доступ к HttpContext.Cache.

2 голосов
/ 22 марта 2012

Дарин тоже прав, как бы я ни делал следующий код для хранения на сервере в течение X минут.

 private IEnumerable<SelectListItem> GetGlobalUrlRegion(string profileName)
    {
        string cacheKey = "cacheUrlRegion";
        RegionTasks regionTasks = RegionTasks.CreateRegionTasks();
        IEnumerable<SelectListItem> regionUrlList = HttpContext.Cache[cacheKey] as IEnumerable<SelectListItem>;
        if (regionUrlList == null)
        {
            var regionObject = regionTasks.GetRegions(profileName);
            var cTime = DateTime.Now.AddMinutes(int.Parse(System.Configuration.ConfigurationSettings.AppSettings["GlobalCacheDurationInMin"].ToString()));
            var cExp = System.Web.Caching.Cache.NoSlidingExpiration;
            var cPri = System.Web.Caching.CacheItemPriority.Normal;
            regionUrlList = regionObject;
            HttpContext.Cache.Insert(cacheKey, regionObject, null, cTime, cExp, cPri, null);
        }

        return regionUrlList;
    }
...