关于缓存,先前尝试了:

● 在"MVC缓存01,使用控制器缓存或数据层缓存"中,分别在控制器和Data Access Layer实现了缓存

● 在"MVC缓存02,使用数据层缓存,添加或修改时让缓存失效"中也尝试了在添加或修改时让缓存失效
 

本篇,要尝试的是视图缓存。

 

□ 思路

1、缓存的载体是什么?
在Data Access Layer中,缓存是围绕System.Runtime.Caching进行的,而在视图层面,当然是围绕上下缓存HttpContext.Cache而进行。

 

2、缓存内容如何显示?
老赵用部分视图显示缓存内容,而张占岭先生在此基础上,使用HelperResult把缓存字符串最终写到视图页面上。

 

  视图缓存通用方法

围绕HtmlHelper.ViewContext.HttpContext.Cache而进行。我就干脆把扩展方法的命名空间改成System.Web.Mvc,避免在视图配置文件中配置,另外,扩展方法的返回类型保持和HtmlHelper一致,也是MvcHtmlString。

 

视图中:

Before Rendering: @DateTime.Now
 
<br />
 
<span style="color: red">
Rendering: 
@Html.Cache("Now",null, DateTime.Now.AddSeconds(60),System.Web.Caching.Cache.NoSlidingExpiration,
() => {System.Threading.Thread.Sleep(5000);return DateTime.Now;})
</span>
<br/>
 
After Rendering:
@DateTime.Now

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

结果:

第一次显示:

第二次显示:

 

接着,老赵在"适合ASP.NET MVC的视图片断缓存方式(中):更实用的API"一文中,使用部分视图把缓存内容显示出来,我没有深究,因为看到张占岭先生用更简单的方法实现了相同的效果。

 

  使用HelperResult显示缓存内容

HelperResult是.NET基础架构中的一员,它的构造函数接收类型为System.IO.TextWriter的System.Action参数。

 

而System.Action<T>是一个委托:

 

于是,我们就可以使用TextWriter把缓存字符串写出来。

 

视图中:

Before Rendering:@DateTime.Now
<br/>
Rendering:@Html.CacheZ("test", DateTime.Now.AddMinutes(1),@<span style="color: red">@DateTime.Now</span>)
<br/>
After Rendering:@DateTime.Now

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

感谢老赵引出了视图缓存的通用思路,同时,佩服张占岭先生对代码作了很大程度的简化!

最后,引用老赵的话:Business,Data Access,Presentation,每一层都有缓存。同级别的缓存,各种方式各有使用场景,各有缺点。

MVC缓存03,扩展方法实现视图缓存的更多相关文章

  1. AbpVnext使用分布式IDistributedCache Redis缓存(自定义扩展方法)

    AbpVnext使用分布式IDistributedCache缓存from Redis(带自定义扩展方法) 我的依赖包的主要版本以及Redis依赖如下 1:添加依赖 <PackageReferen ...

  2. mvc给html扩展方法:

    mvc给html扩展方法: 注意:扩展方法和所在的类都必须是 public static如果在页面直接使用新扩展的方法,需要web.config里把Web.Helper名称命名空间加上,页面才能访问到 ...

  3. Mvc 分页栏扩展方法

    using System; using System.Collections.Generic; using System.Reflection; using System.Text; using Sy ...

  4. 自定义MVC的Helper扩展方法

    记得在开发ASP.NET时候,也经常性使用C#可以写自己义的扩展方法,如:http://www.cnblogs.com/insus/p/3154363.html 或http://www.cnblogs ...

  5. 自定义MVC的Helper扩展方法 转 Insus.NET

    记得在开发ASP.NET时候,也经常性使用C#可以写自己义的扩展方法,如: http://www.cnblogs.com/insus/p/3154363.html 或http://www.cnblog ...

  6. ASP.NET + MVC5 入门完整教程四---MVC 中使用扩展方法

    https://blog.csdn.net/qq_21419015/article/details/80433640 1.示例项目准备1)项目创建新建一个项目,命名为LanguageFeatures ...

  7. Enum扩展及MVC中DropDownListFor扩展方法的使用

    public enum SearchState { /// <summary> /// 全部 /// </summary> [Description("全部" ...

  8. MVC 中使用扩展方法

     扩展方法(Extension Method)是给那些不是你拥有.因而不能直接修改的类添加方法的一种方便的办法. 一.使用扩展方法 1.定义一个购物车的类-ShoppingCart using Sys ...

  9. ASP.NET MVC之持久化TempData及扩展方法(十三)

    前言 之前在开始该系列之前我们就讲述了在MVC中从控制器到视图传递数据的四种方式,但是还是存在一点问题,本节就这个问题进行讲述同时进行一些练习来看看MVC中的扩展方法. 话题 废话不必多说,我们直接进 ...

随机推荐

  1. SNMP详解

    简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议.在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案:由于SNMP的简单性,在Inter ...

  2. java定时器的几种用法[转]

                                  Timer timer =          timer.schedule(                              Sy ...

  3. peewee 字段属性help_text的支持问题

    至少在__version__ = '2.6.0'的时候,给字段添加help_text的时候,在数据库的ddl语句里面是没有comment的. 看了下源码,顺藤摸瓜,最终定位到了字段(Field类)的_ ...

  4. peewee Model.get的复杂查询

    (a | b )&c 官方文档没有具体讲到,又没有太多时间来看源码.经过尝试, (a | b) and c (a or b) and c 都是可以的. 而  (a | b) &c 是不 ...

  5. 【Network】高性能 UDP 服务应该怎么搞?

    参考资料: Netty系列之Netty高性能之道 C++高性能服务框架revover:rudp总体介绍(可靠UDP传输) - zerok的专栏 - 博客频道 - CSDN.NET 高性能异步Socke ...

  6. crontab命令

    前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个 ...

  7. Failed to issue method call: Unit httpd.service failed to load: No such file or directory.

    centos7修改httpd.service后运行systemctl restart httpd.service提示 Failed to issue method call: Unit httpd.s ...

  8. Java计时器Timer和TimerTask用法

    package com.sy.game.test; import java.util.Timer; import java.util.TimerTask; public class TimeTask ...

  9. ffmpeg-20160517-git-bin

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...

  10. codeforces Educational Codeforces Round 5 A. Comparing Two Long Integers

    题目链接:http://codeforces.com/problemset/problem/616/A 题目意思:顾名思义,就是比较两个长度不超过 1e6 的字符串的大小 模拟即可.提供两个版本,数组 ...