​老赵同志写的页面缓存片断不错,​​用着方便,但我感觉在前端调用上有些不便,可以我把他的代码又改了一下,呵呵!

老赵代码的调用:

Before Rendering:
<%= DateTime.Now %>

<br />

Rendering:
<%= Html.Cache("Now", null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration,
() => { System.Threading.Thread.Sleep(5000); return DateTime.Now; }) %>

<br />

After Rendering:
<%= DateTime.Now %>

占占页面片断缓存的调用:

@Html.Cache("test", DateTime.Now.AddMinutes(1),
@<span>
@DateTime.Now
</span>
);

前台UI层使用了razor视图引擎,写法上很简介,它与C#方法容为一体,我的HTML代码以参数的形式传递给了Cache方法,再看一下Cache方法原型:

/// <summary>
/// 缓存的扩展方法
/// </summary>
public static class CacheExtensions
{
/// <summary>
/// 对页面中指定字符串进行缓存
/// </summary>
/// <param name="htmlHelper"></param>
/// <param name="cacheKey">缓存Key</param>
/// <param name="cacheDependencies">缓存依附对象,可以为null</param>
/// <param name="absoluteExpiration">过期时间</param>
/// <param name="slidingExpiration">相对本次过期时间</param>
/// <param name="func">要缓存对象</param>
/// <returns></returns>
public static HelperResult Cache(this HtmlHelper htmlHelper, string cacheKey, CacheDependency cacheDependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, Func<object, HelperResult> func)
{
var cache = htmlHelper.ViewContext.HttpContext.Cache;
var content = cache.Get(cacheKey) as string;

if (content == null)
{
content = func.Invoke(null).ToHtmlString();
cache.Insert(cacheKey, content, cacheDependencies, absoluteExpiration, slidingExpiration);
}

return new HelperResult(writer =>
{
writer.Write(content);
});
}

/// <summary>
/// 对页面中指定字符串进行缓存
/// </summary>
/// <param name="htmlHelper"></param>
/// <param name="cacheKey">缓存Key</param>
/// <param name="absoluteExpiration">过期时间</param>
/// <param name="slidingExpiration">相对本次的过期时间</param>
/// <param name="func">要缓存对象</param>
/// <returns></returns>
public static HelperResult Cache(this HtmlHelper htmlHelper, string cacheKey, DateTime absoluteExpiration, TimeSpan slidingExpiration, Func<object, HelperResult> func)
{
return Cache(htmlHelper, cacheKey, null, absoluteExpiration, slidingExpiration, func);
}

/// <summary>
/// 对页面中指定字符串进行缓存
/// </summary>
/// <param name="htmlHelper"></param>
/// <param name="cacheKey">缓存Key</param>
/// <param name="absoluteExpiration">过期时间</param>
/// <param name="func">要缓存对象</param>
/// <returns></returns>
public static HelperResult Cache(this HtmlHelper htmlHelper, string cacheKey, DateTime absoluteExpiration, Func<object, HelperResult> func)
{
return Cache(htmlHelper, cacheKey, null, absoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, func);
}
}

呵呵,赶快去部署一下吧,有时,我们在考虑代码的功能性的同时,也应该多注意一下代码的调用的方便性与代码表现出现的艺术性!

感谢您的阅读!

感谢老赵同志!

作者:仓储大叔,张占岭,
荣誉:微软MVP