MVC3缓存之一:使用页面缓存

在MVC3中要如果要启用页面缓存,在页面对应的Action前面加上一个OutputCache属性即可。

我们建一个Demo来测试一下,在此Demo中,在View的Home目录下的Index.cshtml中让页面输入当前的时间。

[csharp] view plaincopy
.@{
. Layout = null;
.}
.<!DOCTYPE html>
.<html>
.<head>
. <title>Index</title>
.</head>
.<body>
. <div>
. <h2>
. 现在时间:@DateTime.Now.ToString("T")</h2>
. </div>
.</body>
.</html> 在Controllers中添加对应的Action,并加上OutputCache属性。 [csharp] view plaincopy
.[HandleError]
.public class HomeController : Controller
.{
. [OutputCache(Duration = , VaryByParam = "none")]
. public ActionResult Index()
. {
. return View();
. }
.} 刷新页面即可看到页面做了一个5秒的缓存。当页面中数据不是需要实时的呈现给用户时,这样的页面缓存可以减小实时地对数据处理和请求,当然这是针对整个页面做的缓存,缓存的粒度还是比较粗的。 缓存的位置 可以通过设置缓存的Location属性,决定将缓存放置在何处。 Location可以设置的属性如下: · Any · Client · Downstream · Server · None · ServerAndClient Location的默认值为Any。一般推荐将用户侧的信息存储在Client端,一些公用的信息存储在Server端。 加上Location应该像这样。 [csharp] view plaincopy
.[HandleError]
.public class HomeController : Controller
.{
. [OutputCache(Duration = , VaryByParam = "none", Location = OutputCacheLocation.Client, NoStore = true)]
. public ActionResult Index()
. {
. return View();
. }
.} 缓存依赖 VaryByParam可以对缓存设置缓存依赖条件,如一个产品详细页面,可能就是根据产品ID进行缓存页面。 缓存依赖应该设置成下面这样。 在MVC3中对输出缓存进行了改进,OutputCache不需要手动指定VaryByParam,会自动使用Action的参数作为缓存过期条件。 [csharp] view plaincopy
.[HandleError]
.public class HomeController : Controller
.{
. [OutputCache(Duration = int.MaxValue, VaryByParam = "id")]
. public ActionResult Index()
. {
. return View();
. }
.} 另一种通用的设置方法 当我们需要对多个Action进行统一的设置时,可以在web.config文件中统一配置后进行应用即可。 在web.config中配置下Caching节点 [csharp] view plaincopy
.<caching>
.<outputCacheSettings>
. <outputCacheProfiles>
. <add name="Cache1Hour" duration="" varyByParam="none"/>
. </outputCacheProfiles>
.</outputCacheSettings>
.</caching> 那么在Action上使用该配置节点即可,这样的方法对于统一管理配置信息比较方便。 [csharp] view plaincopy
.[HandleError]
.public class HomeController : Controller
.{
. [OutputCache(CacheProfile = "Cache1Hour")]
. public ActionResult Index()
. {
. return View();
. }
.} MVC3缓存之二:页面缓存中的局部动态 MVC中有一个Post-cache substitution的东西,可以对缓存的内容进行替换。 使用Post-Cache Substitution •定义一个返回需要显示的动态内容string的方法。
•调用HttpResponse.WriteSubstitution()方法即可。 示例,我们在Model层中定义一个随机返回新闻的方法。 [csharp] view plaincopy
.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)];
. }
. }
.} 然后在页面中需要动态显示内容的地方调用。 [csharp] view plaincopy
.<%@ 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加上缓存属性。 [csharp] view plaincopy
.using System.Web.Mvc;
.
.namespace MvcApplication1.Controllers
.{
. [HandleError]
. public class HomeController : Controller
. {
. [OutputCache(Duration=, VaryByParam="none")]
. public ActionResult Index()
. {
. return View();
. }
. }
.} 可以发现,程序对整个页面进行了缓存60s的处理,但调用WriteSubstitution方法的地方还是进行了随机动态显示内容。 对Post-Cache Substitution的封装 将静态显示广告Banner的方法封装在AdHelper中。 [csharp] view plaincopy
.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);
. }
. }
.} 这样在页面中只要进行这样的调用,记得需要在头部导入命名空间。 [csharp] view plaincopy
.<%@ 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> 使用这样的方法可以使得内部逻辑对外呈现出更好的封装。 MVC3缓存之三:MVC3中的局部缓存(Partial Page) MVC3版本中,新增了一个叫做Partial Page的东西,即可以对载入到当前页面的另外的一个View进行缓存后输出,这与我们之前讨论的局部动态刚好相反了,即之前我们进行这个页面的缓存,然后对局部进行动态输出,现在的解决方案是:页面时动态输出的,而对需要缓存的局部进行缓存处理。查来查去还没有看到局部动态的解决方案,所以我们先看看局部缓存的处理方法。 局部缓存(Partial Page) 我们先建立一个需要局部缓存的页面View,叫做PartialCache.cshtml,页面内容如下: [csharp] view plaincopy
.<p>@ViewBag.Time2</p> 在其对应的Controller中添加对应的Action [csharp] view plaincopy
.[OutputCache(Duration = )]
.public ActionResult PartialCache()
.{
. ViewBag.Time2 = DateTime.Now.ToLongTimeString();
. return PartialView();
.} 我们可以看到对其Action做了缓存处理,对页面进行缓存10秒钟。 而在Index的View中调用此缓存了的页面则需要这样: [csharp] view plaincopy
.@{
. ViewBag.Title = "Index";
.}
.<h2>
. OutputCache Demo</h2>
.<p>
. No Cache</p>
.<div>@DateTime.Now.ToLongTimeString()
.</div>
.<br />
.<p>
. Partial Cache mins
.</p>
.<div class="bar2">@Html.Action("PartialCache", "Index", null)</div> 运行后,我们刷新页面可以发现Index的主体没有缓存,而引用到的PartialCache进行了10秒缓存的处理。

转自:http://blog.csdn.net/try530/article/details/6599359

MVC缓存的使用的更多相关文章

  1. MVC缓存

    MVC入门系列教程-视频版本,已入驻51CTO学院,文本+视频学效果更好哦.视频链接地址如下: 点我查看视频.另外,针对该系列教程博主提供有偿技术支持,群号:226090960,群内会针对该教程的问题 ...

  2. MVC 缓存

    MVC  缓存 http://blog.zhaojie.me/2009/09/aspnet-mvc-fragment-cache-1.html redis http://www.cnblogs.com ...

  3. MVC缓存OutPutCache学习笔记 (二) 缓存及时化VaryByCustom

    <MVC缓存OutPutCache学习笔记 (一) 参数配置> 本篇来介绍如何使用 VaryByCustom参数来实现缓存的及时化.. 根据数据改变来及时使客户端缓存过期并更新.. 首先更 ...

  4. MVC缓存OutPutCache学习笔记 (一) 参数配置

    OutPutCache 参数详解 Duration : 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location : 缓存放置的位置; 该 ...

  5. MVC缓存03,扩展方法实现视图缓存

    关于缓存,先前尝试了: ● 在"MVC缓存01,使用控制器缓存或数据层缓存"中,分别在控制器和Data Access Layer实现了缓存 ● 在"MVC缓存02,使用数 ...

  6. MVC缓存02,使用数据层缓存,添加或修改时让缓存失效

    在"MVC缓存01,使用控制器缓存或数据层缓存"中,在数据层中可以设置缓存的有效时间.但这个还不够"智能",常常希望在编辑或创建的时候使缓存失效,加载新的数据. ...

  7. MVC缓存OutputCacheAttribute 类提高网站效率(转)

    原文转自:http://www.cnblogs.com/iamlilinfeng/p/4419362.html 命名空间:  System.Web.Mvc 程序集:  System.Web.Mvc(在 ...

  8. MVC缓存技术

    一.MVC缓存简介 缓存是将信息(数据或页面)放在内存中以避免频繁的数据库存储或执行整个页面的生命周期,直到缓存的信息过期或依赖变更才再次从数据库中读取数据或重新执行页面的生命周期.在系统优化过程中, ...

  9. MVC缓存,使用数据层缓存,添加或修改时让缓存失效

    在"MVC缓存01,运用控制器缓存或数据层缓存"中,在数据层中可以设置缓存的有用时刻.但这个还不够"智能",常常期望在修改或创立的时分使缓存失效,加载新的数据. ...

  10. MVC 缓存1

    MVC 缓存 为什么要讲缓存.缓存到底有什么作用? 下面我们来说一个场景我们有一个首页菜单的布局基本是不会经常发生的变化,如果动态生成的 Web 页被频繁请求并且构建时需要耗用大量的系统资源,那么,如 ...

随机推荐

  1. leetcode Database3

    一.Rank Scores Write a SQL query to rank scores. If there is a tie between two scores, both should ha ...

  2. 《OD学hadoop》第二周0702

    大数据离线计算hadoop2.x 三周(6天) markdown文本剪辑器 罗振宇--跨年演讲,时间的朋友 http://tech.163.com/16/0101/11/BC87H8DF000915B ...

  3. Python3 学习第十一弹: 模块学习四之sys库

    sys模块 提供一些与python解释器关系紧密的变量和函数 1> argv 命令行参数 通过命令行可以向python传输参数 2> exit([arg]) 程序退出,可以返回给命令行一个 ...

  4. jQuery 动画 _animate() 方法

    一.jQuery animate() 方法用于创建自定义动画. 必需的 params 参数定义形成动画的 CSS 属性. 可选的 speed 参数规定效果的时长.它可以取以下值:"slow& ...

  5. laravel, Composer和autoloading

    http://www.php-fig.org/psr/psr-4/ http://www.php-fig.org/psr/psr-0/ http://alanstorm.com/laravel_com ...

  6. asp.net下通过泛解析和伪静态实现二级域名的实现方法

    在net中微软已经为我们留下了接口,让我们为所欲为了. 首先我们可以通过一张图大概了解下.net的生命周期. 从 上图可以看出来,针对每个不同用户的请求,服务器都会创建一个新的HttpContext实 ...

  7. BZOJ 1076 奖励关

    注意几点: 1.为什么要逆推?由此状态可以轻易算出彼状态是否可行,而彼状态却无法轻易还原为此状态. 2.为什么可以逆推?假设时光倒流了....23333 3.注意位运算的准确,大胆写方程. #incl ...

  8. BZOJ 2429 聪明的猴子

    kruskal. #include<iostream> #include<cstdio> #include<cstring> #include<algorit ...

  9. UVA 489 Hangman Judge (字符匹配)

    题意:给一个字符串A,只含小写字符数个.再给一个字符串B,含小写字符数个.规则如下: 1.字符串B从左至右逐个字符遍历,对于每个字符,如果该字符在A中存在,将A中所有该字符删掉,若不存在,则错误次数+ ...

  10. Linux/Unix shell 自动发送AWR report(二)

    观察Oracle数据库性能,Oracle自带的awr 功能为我们提供了一个近乎完美的解决方案,通过awr特性我们可以随时从数据库提取awr报告.不过awrrpt.sql脚本执行时需要我们提供一些交互信 ...