【问题标题】:Cache dropbox items in MVC razor. How to do that?在 MVC razor 中缓存 Dropbox 项目。怎么做?
【发布时间】:2012-03-20 12:36:03
【问题描述】:

如何在 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();
    }

我已经测试过了,它没有缓存区域的项目。

我该怎么做?

【问题讨论】:

  • Output cache in MVC的可能重复
  • 为什么又问同样的问题?
  • 可能OutputCache 仅适用于ActionResult,而您的 Duration 设置为 10 秒。

标签: asp.net-mvc-3 outputcache


【解决方案1】:

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】:

    Darin 也是对的,我是如何完成以下代码在服务器上存储 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;
        }
    

    【讨论】:

    • 干杯,投票。我遇到的一个问题(使用类似的实现)是正在设置我的 regionUrlList 等价物,但我似乎无法在第一次运行时读取该值,从而导致异常。但是,它确实在第二次运行时跳过了 if 块,并返回了正确的值。我的方法是在if 块之前将regionObject 初始化(我的等价物)为null,然后使用类似的东西作为返回 - return (regionObject != null) ? regionObject : regionUrlList。这样就应该返回一个值,即使它由于某种原因尚未在缓存中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2012-07-02
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    相关资源
    最近更新 更多