MVC3缓存之二:页面缓存中的局部动态

简介: 在上一篇我们讨论了MVC中使用页面缓存的一些方法,而其中由于页面缓存的粒度太粗,不能对页面进行局部的缓存,或者说,如果我们想在页面缓存的同时对局部进行动态输出该怎么办?下面我们看下这类问题的处理。 MVC中有一个Post-cache substitution的东西,可以对缓存的内容进行替换。

上一篇我们讨论了MVC中使用页面缓存的一些方法,而其中由于页面缓存的粒度太粗,不能对页面进行局部的缓存,或者说,如果我们想在页面缓存的同时对局部进行动态输出该怎么办?下面我们看下这类问题的处理。

MVC中有一个Post-cache substitution的东西,可以对缓存的内容进行替换。 

使用Post-Cache Substitution

 

  • 定义一个返回需要显示的动态内容string的方法。
  • 调用HttpResponse.WriteSubstitution()方法即可。

 

示例,我们在Model层中定义一个随机返回新闻的方法。

using  System;
using  System.Collections.Generic;
using  System.Web;

namespace  MvcApplication1.Models
{
    
public   class  News
    {
        
public   static   string  RenderNews(HttpContext context)
        {
            var news 
=   new  List < string >  
                { 
                    
" Gas prices go up! "
                    
" Life discovered on Mars! "
                    
" Moon disappears! "  
                };
            
            var rnd 
=   new  Random();
            
return  news[rnd.Next(news.Count)];
        }
    }

}  

然后在页面中需要动态显示内容的地方调用。

<% @ Page Language = " C# "  AutoEventWireup = " true "  CodeBehind = " Index.aspx.cs "  Inherits = " MvcApplication1.Views.Home.Index "   %>
<% @ Import Namespace = " MvcApplication1.Models "   %>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml"   >
< head  runat ="server" >
    
< title > Index </ title >
</ head >
< body >
    
< div >   
    
<%  Response.WriteSubstitution(News.RenderNews);  %>         
    
< hr  />     
    The content of this page is output cached.
    
<% =  DateTime.Now  %>     
    
</ div >
</ body >

</html> 

如在上一篇文章中说明的那样,给Controller加上缓存属性。

using  System.Web.Mvc;

namespace  MvcApplication1.Controllers
{
    [HandleError]
    
public   class  HomeController : Controller
    {
        [OutputCache(Duration
= 60 , VaryByParam = " none " )]
        
public  ActionResult Index()
        {
            
return  View();
        }
    }

}

可以发现,程序对整个页面进行了缓存60s的处理,但调用WriteSubstitution方法的地方还是进行了随机动态显示内容。

对Post-Cache Substitution的封装

将静态显示广告Banner的方法封装在AdHelper中。

using  System;
using  System.Collections.Generic;
using  System.Web;
using  System.Web.Mvc;

namespace  MvcApplication1.Helpers
{
    
public   static   class  AdHelper
    {
        
public   static   void  RenderBanner( this  HtmlHelper helper)
        {
            var context 
=  helper.ViewContext.HttpContext;
            context.Response.WriteSubstitution(RenderBannerInternal);
        }
        
        
private   static   string  RenderBannerInternal(HttpContext context)
        {
            var ads 
=   new  List < string >  
                { 
                    
" /ads/banner1.gif "
                    
" /ads/banner2.gif "
                    
" /ads/banner3.gif "  
                };

            var rnd 
=   new  Random();
            var ad 
=  ads[rnd.Next(ads.Count)];
            
return  String.Format( " <img src='{0}' /> " , ad);
        }
    }

这样在页面中只要进行这样的调用,记得需要在头部导入命名空间。

<% @ Page Language = " C# "  AutoEventWireup = " true "  CodeBehind = " Index.aspx.cs "  Inherits = " MvcApplication1.Views.Home.Index "   %>
<% @ Import Namespace = " MvcApplication1.Models "   %>
<% @ Import Namespace = " MvcApplication1.Helpers "   %>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml"   >
< head  runat ="server" >
    
< title > Index </ title >
</ head >
< body >
    
< div >
    
<%  Response.WriteSubstitution(News.RenderNews);  %>     
    
< hr  />     
    
<%  Html.RenderBanner();  %>     
    
< hr  />     
    The content of this page is output cached.
    
<% =  DateTime.Now  %>
    
</ div >
</ body >

</html>  

使用这样的方法可以使得内部逻辑对外呈现出更好的封装。


作者:Parry
出处:http://www.cnblogs.com/parry/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

相关文章
|
4月前
|
缓存 JavaScript
vue 页面缓存 keep-alive(含配置清除页面缓存 exclude,局部缓存,动态缓存,路由控制缓存 $route.meta.keepAlive)
vue 页面缓存 keep-alive(含配置清除页面缓存 exclude,局部缓存,动态缓存,路由控制缓存 $route.meta.keepAlive)
513 0
|
5月前
|
缓存 JavaScript API
Vue-Router路由动态缓存组件(keep-alive),vue2/vue3不同写法
Vue-Router路由动态缓存组件(keep-alive),vue2/vue3不同写法
|
6月前
|
SQL 缓存
IBATIS别名SELECT(缓存字段)引起的问题(动态sql)
IBATIS别名SELECT(缓存字段)引起的问题(动态sql)
|
缓存 JavaScript
vue中页面缓存keep-alive控制缓存清除
vue中页面缓存keep-alive控制缓存清除
|
6月前
|
前端开发 Java UED
解密Spring MVC异常处理:从局部到全局,打造稳固系统的关键步骤
解密Spring MVC异常处理:从局部到全局,打造稳固系统的关键步骤
199 0
|
存储 SQL 缓存
ASP.NET Core MVC 从入门到精通之缓存
ASP.NET Core MVC 从入门到精通之缓存
132 0
|
缓存
CPU缓存一致性协议动态表示
CPU缓存一致性协议动态表示
80 0
|
XML JSON 前端开发
【Spring MVC学习笔记 六】SpringMVC框架整合AJAX完成局部刷新
【Spring MVC学习笔记 六】SpringMVC框架整合AJAX完成局部刷新
98 0
|
XML 存储 缓存
设计一个缓存策略,动态缓存热点数据
写在前面,因为我们最近的大作业项目需要用到热点排行这个功能,因为我们是要使用Elasticsearch来存储数据,然后最初设想是在ES中实现这个热点排行的功能,但是经过仔细思考,在我们这个项目中使用ES来做热点排行是一个很蠢的方式,因为我们这只是一个很小的排行,所以最终我们还是使用Redis来实现热点排行
462 1
设计一个缓存策略,动态缓存热点数据
|
缓存 NoSQL 网络协议
Go项目优化——动态缓存Redis的使用
Go项目优化——动态缓存Redis的使用
332 0