适合ASP.NET MVC的视图片断缓存方式(上):起步

说到网站性能优化,没有什么比“缓存”更重要了。即便是某些朋友口中念念不忘的“静态页”,说

到底也只是缓存了整张页面内容而已。但是,显然这样大粒度的缓存策略,在如今“牵一发而动全身”的

Web 2.0站点中几乎是无法使用的。试想,在Twitter中的某个名人被数十万人订阅,那么他发一条消息,

难道此时网站要去修改数十万用户的静态页面?因此,我们需要粒度更小的缓存。而比“整页缓存”粒度

小一号的缓存,便是所谓“视图片断缓存”了。

视图片断缓存非常重要,因为它缓存的也是页面内容,这表示它比更低级别的缓存更有效率,也比静

态页等整页内容缓存的适用面要大得多。在ASP.NET WebForm模型中提供了控件级别的缓存,我们可以为

控件标记输出缓存策略,这样控件便不会每次都完整执行一遍。当然这个策略还不够灵活,因为它缓存的

最小单元是“控件”,而不是页面中任意的部分。因此我在一年多前提出了一个CachePanel,由它包装的

页面内容都可以被缓存,无论其内部是控件还是普通输出的内容。在实际生产过程中,CachePanel起到了

非常重要的作用,许多场景下只要在页面中包裹一个<ext:CachePanel runat="server" />,性能

立即就有了质的飞跃。

只可惜,在如今ASP.NET MVC的时代无法直接使用CachePanel这样的服务器端控件。因为CachePanel需

要服务器端代码的配合,而ASP.NET MVC中的页面只是“视图模板”,除了呈现之外就不应该有其他职责

。因此,我们必须提出一种脱离于后端代码的“标记”方式,将视图中的内容片断进行随意地缓存。在

Rails或Django中都有类似的特性,但ASP.NET MVC甚至在2.0的Road Map中还没有包含这一功能,于是我

们只能自己动手丰衣足食。不过有了ASP.NET WebForm作为强大的视图引擎,加这样的功能简直是举手之

劳:

public static class CacheExtensions
{
  public static string Cache

(
    this HtmlHelper htmlHelper,
    string cacheKey,
    

CacheDependency cacheDependencies,
    DateTime absoluteExpiration,
    

TimeSpan slidingExpiration,
    Func<object> func) 
  {
    var

 cache = htmlHelper.ViewContext.HttpContext.Cache;
    var content = cache.Get

(cacheKey) as string;

    if (content == null) 
    {
     

 content = func().ToString();
      cache.Insert(cacheKey, content, 

cacheDependencies, absoluteExpiration, slidingExpiration);
    } 

    

return content;
  } 
}

时间: 2024-09-16 10:31:32

适合ASP.NET MVC的视图片断缓存方式(上):起步的相关文章

适合ASP.NET MVC的视图片断缓存方式(下):页面输出原则

上一篇文章里已经把Html.Cache打造成了非常具有可用性的API,需要缓存时我们只需在页面上做一个 标记即可: <% Html.Cache("cache_key", DateTime.Now.AddSeconds(10), () => { % > <% foreach (var article in Model.Articles) { %> <p><%= article.Body %></p> <% } %&g

适合ASP.NET MVC的视图片断缓存方式(中):更实用的API

上一篇文章中我们提出了了片断缓存的基本方式,也就是构建HtmlHelper的扩展方法Cache,接受一个 用于生成字符串的委托对象.在缓存命中时,则直接返回缓存中的字符串片断,否则则使用委托生成的内 容.因此,缓存命中时委托的开销便节省了下来.不过这个方法并不实用,如果您要缓存大片的HTML,还 需要准备一个Partial View,再用它来生成网页片段: <%= Html.Cache(..., () => Html.Partial("MyPartialViewToCache&quo

ASP.NET MVC 5 - 视图

原文:ASP.NET MVC 5 - 视图 在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所引入的Razor视图引擎(Razor view engine).Razor视图模板文件使用.cshtml文件扩展名,并提供了一个优雅的方式来使用C#语言创建所要输出的HTML.用Razor编写一个视图模板文件时,将所需的字符和键盘敲击数量降到了最低,并实现

一起谈.NET技术,ASP.NET MVC之视图引擎

最近微软发布了另外一个在ASP.NET MVC上应用的视图引擎Razor.通过前面一系列的探讨,我想大部分都了解了ASP.NET MVC整个的原理,包括TempData.ViewData.ModelBinding.Filter等,但是我们还不是太了解它的视图引擎的情况.ASP.NET MVC的视图引擎具有非常好的扩展性,我们可以使用其它的视图引擎代替WebForm,或是同时使用多种试图引擎,这些都得益于ASP.NET MVC精美的设计,下面我们一起来观赏一下它的设计. 内容概览: ActionR

ASP.NET MVC之视图引擎

最近微软发布了另外一个在ASP.NET MVC上应用的视图引擎Razor.通过 前面一系列的探讨,我想大部分都了解了ASP.NET MVC整个的原理,包括TempData.ViewData.ModelBinding.Filter等, 但是我们还不是太了解它的视图引擎的情况.ASP.NET MVC的视图引擎具有非常好的扩展性,我们可以使用其它的视图引擎代替WebForm,或是同时使用多种试图引擎,这些都得益于ASP.NET MVC精美的设计,下面我们一起来观赏一下它的设计. 内容概览: Actio

ASP.NET MVC 2: 视图输出过程中,Response.Clear不正常工作

在即将发布的Kooboo CMS 2.1.0.0中,将会升级到ASP.NET MVC 2.需要将所 有的Module也同步升级到MVC2,在升级过程中发现MVC2一旦进入View输出阶段后 ,Response.Clear将会不起作用 (Controller执行阶段,这个方法仍然正常工作) ,这将会影响Kooboo CMS Module的正常运行. 在确定是MVC 2引起的问题后,于是就从Response.Clear这个方法着手,它的 代码逻辑如下: 01 public void Clear()

Asp.net MVC 4 视图相关和其他

@{ Layout = "-"} To define layout page Equivalent to asp.net master-page 要定义相当于ASP.NET母版页的页面布局 @model <StrongModelType> To define strongly-typed model 要定义强类型的模型 @section <name> { } To define named section 定义命名节 @RenderBody Used in la

asp.net mvc 浏览视图弹出保存action对话框?

问题描述 不显示视图,只弹出保存对话框,咋么回事? 解决方案 解决方案二: 解决方案三:你这个是IE浏览器吧,不知道是不是版本问题.好像有一个注册码,不过也只是有的可以有的不可以,我当初用webbrowser控件去获取网址返回过来的Json数据的时候,也会提示让我保存什么东西你到百度搜"返回json数据提示下载"按照他们的方法试试

ASP.NET MVC从视图传递多个模型到Controller

从后台组织好数据然后传递到页面倒是水到渠成很方便,因为MVC自身就将这样的需求内建到了这个系统中.我只需要在后台组织好一个List 或IEnumerable类型的变量,将需要传递的数据模型扔进去便可.   比如这里我们向视图返回5条product信息在页面进行展示,仅仅是返回这么简单.   然后在页面我们就毫不费力地得到了后台传过来的数据模型,然后进行显示即可.   但问题是,如何又将多个模型传回后台去呢.一个form一般只传递一个模型,我们可以在JavaScript里序列化多个模型然后通过aj