zoukankan      html  css  js  c++  java
  • MVC3缓存之一:使用页面缓存

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

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

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

    [csharp] view plain copy
     
    1. @{  
    2.     Layout = null;  
    3. }  
    4. <!DOCTYPE html>  
    5. <html>  
    6. <head>  
    7.     <title>Index</title>  
    8. </head>  
    9. <body>  
    10.     <div>  
    11.         <h2>  
    12.             现在时间:@DateTime.Now.ToString("T")</h2>  
    13.     </div>  
    14. </body>  
    15. </html>  

    在Controllers中添加对应的Action,并加上OutputCache属性。
     
    [csharp] view plain copy
     
    1. [HandleError]  
    2. public class HomeController : Controller  
    3. {  
    4.     [OutputCache(Duration = 5, VaryByParam = "none")]  
    5.     public ActionResult Index()  
    6.     {  
    7.         return View();  
    8.     }  
    9. }  

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

    缓存的位置

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

    Location可以设置的属性如下:

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

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

    加上Location应该像这样。

    [csharp] view plain copy
     
    1. [HandleError]  
    2. public class HomeController : Controller  
    3. {  
    4.     [OutputCache(Duration = 5, VaryByParam = "none", Location = OutputCacheLocation.Client, NoStore = true)]  
    5.     public ActionResult Index()  
    6.     {  
    7.         return View();  
    8.     }  
    9. }   

    缓存依赖

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

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

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

    [csharp] view plain copy
     
    1. [HandleError]  
    2. public class HomeController : Controller  
    3. {  
    4.     [OutputCache(Duration = int.MaxValue, VaryByParam = "id")]  
    5.     public ActionResult Index()  
    6.     {  
    7.         return View();  
    8.     }  
    9. }  

    另一种通用的设置方法

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

    在web.config中配置下Caching节点

    [csharp] view plain copy
     
    1. <caching>  
    2. <outputCacheSettings>  
    3.     <outputCacheProfiles>  
    4.         <add name="Cache1Hour" duration="3600" varyByParam="none"/>  
    5.     </outputCacheProfiles>  
    6. </outputCacheSettings>  
    7. </caching>  

    那么在Action上使用该配置节点即可,这样的方法对于统一管理配置信息比较方便。
    [csharp] view plain copy
     
    1. [HandleError]  
    2. public class HomeController : Controller  
    3. {  
    4.     [OutputCache(CacheProfile = "Cache1Hour")]  
    5.     public ActionResult Index()  
    6.     {  
    7.         return View();  
    8.     }  
    9. }  

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

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

    使用Post-Cache Substitution

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

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

    [csharp] view plain copy
     
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Web;  
    4.   
    5. namespace MvcApplication1.Models  
    6. {  
    7.     public class News  
    8.     {  
    9.         public static string RenderNews(HttpContext context)  
    10.         {  
    11.             var news = new List<string>   
    12.                 {   
    13.                     "Gas prices go up!",   
    14.                     "Life discovered on Mars!",   
    15.                     "Moon disappears!"   
    16.                 };  
    17.               
    18.             var rnd = new Random();  
    19.             return news[rnd.Next(news.Count)];  
    20.         }  
    21.     }  
    22. }    

    然后在页面中需要动态显示内容的地方调用。
     
    [csharp] view plain copy
     
    1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>  
    2. <%@ Import Namespace="MvcApplication1.Models" %>  
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
    4. <html xmlns="http://www.w3.org/1999/xhtml" >  
    5. <head runat="server">  
    6.     <title>Index</title>  
    7. </head>  
    8. <body>  
    9.     <div>    
    10.     <% Response.WriteSubstitution(News.RenderNews); %>          
    11.     <hr />      
    12.     The content of this page is output cached.  
    13.     <%= DateTime.Now %>      
    14.     </div>  
    15. </body>  
    16. </html>   

    如在上面文章中说明的那样,给Controller加上缓存属性。
    [csharp] view plain copy
     
    1. using System.Web.Mvc;  
    2.   
    3. namespace MvcApplication1.Controllers  
    4. {  
    5.     [HandleError]  
    6.     public class HomeController : Controller  
    7.     {  
    8.         [OutputCache(Duration=60, VaryByParam="none")]  
    9.         public ActionResult Index()  
    10.         {  
    11.             return View();  
    12.         }  
    13.     }  
    14. }  

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

    对Post-Cache Substitution的封装

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

    [csharp] view plain copy
     
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Web;  
    4. using System.Web.Mvc;  
    5.   
    6. namespace MvcApplication1.Helpers  
    7. {  
    8.     public static class AdHelper  
    9.     {  
    10.         public static void RenderBanner(this HtmlHelper helper)  
    11.         {  
    12.             var context = helper.ViewContext.HttpContext;  
    13.             context.Response.WriteSubstitution(RenderBannerInternal);  
    14.         }  
    15.           
    16.         private static string RenderBannerInternal(HttpContext context)  
    17.         {  
    18.             var ads = new List<string>   
    19.                 {   
    20.                     "/ads/banner1.gif",   
    21.                     "/ads/banner2.gif",   
    22.                     "/ads/banner3.gif"   
    23.                 };  
    24.   
    25.             var rnd = new Random();  
    26.             var ad = ads[rnd.Next(ads.Count)];  
    27.             return String.Format("<img src='{0}' />", ad);  
    28.         }  
    29.     }  
    30. }   

    这样在页面中只要进行这样的调用,记得需要在头部导入命名空间。
     
    [csharp] view plain copy
     
    1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>  
    2. <%@ Import Namespace="MvcApplication1.Models" %>  
    3. <%@ Import Namespace="MvcApplication1.Helpers" %>  
    4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
    5. <html xmlns="http://www.w3.org/1999/xhtml" >  
    6. <head runat="server">  
    7.     <title>Index</title>  
    8. </head>  
    9. <body>  
    10.     <div>  
    11.     <% Response.WriteSubstitution(News.RenderNews); %>      
    12.     <hr />      
    13.     <% Html.RenderBanner(); %>      
    14.     <hr />      
    15.     The content of this page is output cached.  
    16.     <%= DateTime.Now %>  
    17.     </div>  
    18. </body>  
    19. </html>    

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

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

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

    局部缓存(Partial Page)

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

    [csharp] view plain copy
     
    1. <p>@ViewBag.Time2</p>  

    在其对应的Controller中添加对应的Action
    [csharp] view plain copy
     
    1. [OutputCache(Duration = 10)]  
    2. public ActionResult PartialCache()  
    3. {  
    4.     ViewBag.Time2 = DateTime.Now.ToLongTimeString();  
    5.     return PartialView();  
    6. }  

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

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

    [csharp] view plain copy
     
    1. @{  
    2.     ViewBag.Title = "Index";  
    3. }  
    4. <h2>  
    5.     OutputCache Demo</h2>  
    6. <p>  
    7.     No Cache</p>  
    8. <div>@DateTime.Now.ToLongTimeString()  
    9. </div>  
    10. <br />  
    11. <p>  
    12.     Partial Cache 10 mins  
    13. </p>  
    14. <div class="bar2">@Html.Action("PartialCache", "Index", null)</div>  

    运行后,我们刷新页面可以发现Index的主体没有缓存,而引用到的PartialCache进行了10秒缓存的处理。
  • 相关阅读:
    Eclipse 插件Maven在使用 add dependency,找不到包,解决办法
    SimpleDateFormat是线程不安全的,切忌切忌!
    JNative 传递参数bug
    oracle存储过程递归调用
    oracle调用DLL
    telnet和Netstat使用
    notepad++搭配dev配置运行C++
    ubuntu第一次安装登陆密码不正确问题
    区分形参和实参
    爬虫2
  • 原文地址:https://www.cnblogs.com/louby/p/5459103.html
Copyright © 2011-2022 走看看