MVC缓存的使用

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

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

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

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <title>Index</title>
</head>
<body>
    <div>
        <h2>
            现在时间:@DateTime.Now.ToString("T")</h2>
    </div>
</body>
</html>

在Controllers中添加对应的Action,并加上OutputCache属性。

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

刷新页面即可看到页面做了一个5秒的缓存。当页面中数据不是需要实时的呈现给用户时,这样的页面缓存可以减小实时地对数据处理和请求,当然这是针对整个页面做的缓存,缓存的粒度还是比较粗的。

缓存的位置

可以通过设置缓存的Location属性,决定将缓存放置在何处。

Location可以设置的属性如下:

· Any
· Client
· Downstream
· Server
· None
· ServerAndClient

Location的默认值为Any。一般推荐将用户侧的信息存储在Client端,一些公用的信息存储在Server端。

加上Location应该像这样。

[HandleError]
public class HomeController : Controller
{
    [OutputCache(Duration = 5, VaryByParam = "none", Location = OutputCacheLocation.Client, NoStore = true)]
    public ActionResult Index()
    {
        return View();
    }
} 

缓存依赖

VaryByParam可以对缓存设置缓存依赖条件,如一个产品详细页面,可能就是根据产品ID进行缓存页面。

缓存依赖应该设置成下面这样。

在MVC3中对输出缓存进行了改进,OutputCache不需要手动指定VaryByParam,会自动使用Action的参数作为缓存过期条件。

[HandleError]
public class HomeController : Controller
{
    [OutputCache(Duration = int.MaxValue, VaryByParam = "id")]
    public ActionResult Index()
    {
        return View();
    }
}

另一种通用的设置方法

当我们需要对多个Action进行统一的设置时,可以在web.config文件中统一配置后进行应用即可。

在web.config中配置下Caching节点

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Cache1Hour" duration="3600" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

那么在Action上使用该配置节点即可,这样的方法对于统一管理配置信息比较方便。
[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层中定义一个随机返回新闻的方法。

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>  

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


MVC3缓存之三:MVC3中的局部缓存(Partial Page)

MVC3版本中,新增了一个叫做Partial Page的东西,即可以对载入到当前页面的另外的一个View进行缓存后输出,这与我们之前讨论的局部动态刚好相反了,即之前我们进行这个页面的缓存,然后对局部进行动态输出,现在的解决方案是:页面时动态输出的,而对需要缓存的局部进行缓存处理。查来查去还没有看到局部动态的解决方案,所以我们先看看局部缓存的处理方法。

局部缓存(Partial Page)

我们先建立一个需要局部缓存的页面View,叫做PartialCache.cshtml,页面内容如下:

<p>@ViewBag.Time2</p>

在其对应的Controller中添加对应的Action
[OutputCache(Duration = 10)]
public ActionResult PartialCache()
{
    ViewBag.Time2 = DateTime.Now.ToLongTimeString();
    return PartialView();
}

我们可以看到对其Action做了缓存处理,对页面进行缓存10秒钟。

而在Index的View中调用此缓存了的页面则需要这样:

@{
    ViewBag.Title = "Index";
}
<h2>
    OutputCache Demo</h2>
<p>
    No Cache</p>
<div>@DateTime.Now.ToLongTimeString()
</div>
<br />
<p>
    Partial Cache 10 mins
</p>
<div class="bar2">@Html.Action("PartialCache", "Index", null)</div>

运行后,我们刷新页面可以发现Index的主体没有缓存,而引用到的PartialCache进行了10秒缓存的处理。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值