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