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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

相关文章
|
5月前
|
缓存 JavaScript
vue中页面缓存keep-alive控制缓存清除
vue中页面缓存keep-alive控制缓存清除
|
缓存 NoSQL 网络协议
Go项目优化——动态缓存Redis的使用
Go项目优化——动态缓存Redis的使用
283 0
|
XML 存储 缓存
设计一个缓存策略,动态缓存热点数据
写在前面,因为我们最近的大作业项目需要用到热点排行这个功能,因为我们是要使用Elasticsearch来存储数据,然后最初设想是在ES中实现这个热点排行的功能,但是经过仔细思考,在我们这个项目中使用ES来做热点排行是一个很蠢的方式,因为我们这只是一个很小的排行,所以最终我们还是使用Redis来实现热点排行
366 1
设计一个缓存策略,动态缓存热点数据
|
缓存 NoSQL 数据库
SpringBoot+Shiro学习之数据库动态权限管理和Redis缓存
发现问题,需找解决思路。 之前我们整合Shiro,完成了登录认证和权限管理的实现,登录认证没什么说的,需要实现AuthorizingRealm中的doGetAuthenticationInfo方法进行认证,但是我们在实现doGetAuthorizationInfo权限控制这个方法的时候发现以下两个问题: 第一个问题:我们在ShiroConfig中配置链接权限的时候,每次只要有一个新的链接,或则权限需要改动,都要在ShiroConfig.java中进行权限的修改。
1198 0
|
缓存 NoSQL Redis
SpringBoot+Shiro 学习之数据库动态权限管理和 Redis 缓存
发现问题,需找解决思路。 之前我们整合Shiro,完成了登录认证和权限管理的实现,登录认证没什么说的,需要实现AuthorizingRealm中的doGetAuthenticationInfo方法进行认证,但是我们在实现doGetAuthorizationInfo权限控制这个方法的时候发现以下两个问题: 第一个问题:我们在ShiroConfig中配置链接权限的时候,每次只要有一个新的链接,或则权限需要改动,都要在ShiroConfig.java中进行权限的修改。
1592 0
|
Web App开发 缓存 索引
|
缓存 物联网 C#
《物联网框架ServerSuperIO教程》- 23.动态数据接口增加缓存,提高数据输出到OPCServer和(实时)数据库的效率
22.1   概述及要解决的问题       设备驱动有DeviceDynamic接口,可以继承并增加新的实时数据属性,每次通讯完成后更新这些属性数据。原来是通过DeviceDynamic接口实体类反射的方式获得最新的实时数据,并输出到关系数据库、实时数据库和OPC Server等接口。
1198 0
|
Web App开发 缓存 JavaScript
ASP.NET性能优化之局部缓存
在网站的开发过程中,经常碰到的一类需求场景是: 1:页面含热点新闻,热点新闻部分需要10分钟更新一次,而整个页面的其它部分1天内都不会变动; 2:首页的某个BANNER需要显式:欢迎***; 上面场景中的1,如果整个页面的缓存失效都定为10分钟,则势必增加性能开销,所以最好的策略是页面的不同部分采用不同的缓存失效时长。
1334 0
|
缓存
MVC3缓存之三:MVC3中的局部缓存(Partial Page)
在之前的文章MVC3缓存之二:页面缓存中的局部动态中,没有注意到MVC3的版本中对输出缓存进行了修改,园友的评论中提及了此问题,所以又去抽时间看了下局部缓存的解决方案。 最后发现在发布的MVC3版本中,新增了一个叫做Partial Page的东西,即可以对载入到当前页面的另外的一个View进行缓存后输出,这与我们之前讨论的局部动态刚好相反了,即之前我们进行这个页面的缓存,然后对局部进行动态输出,现在的解决方案是:页面时动态输出的,而对需要缓存的局部进行缓存处理。
955 0

热门文章

最新文章