【问题标题】:ASP.NET MVC output cache with dynamic fragment带有动态片段的 ASP.NET MVC 输出缓存
【发布时间】:2011-03-21 08:11:43
【问题描述】:

如果用户已登录等等,我怎么能缓存整个页面,除了顶部的一点,上面写着"Welcome back, Matt! | Log Out"

我正在使用 ASP.NET MVC 2。

【问题讨论】:

  • 这有时被称为“甜甜圈缓存”,在 asp.net mvc 2 stackoverflow.com/questions/2806663/donut-caching-asp-net-mvc2987654321@中不受支持
  • 为什么? o_O 有没有其他可行的解决方案?
  • 我还没有看到甜甜圈缓存的实现。您始终可以在控制器中缓存数据,而不是缓存 html 输出。

标签: asp.net asp.net-mvc asp.net-mvc-2 caching fragment-caching


【解决方案1】:

您要实现的目标称为甜甜圈缓存或缓存替换。从 ASP.NET MVC 2 开始,没有内置的帮助程序来支持这种情况。据我所知,它是 MVC v.1 中的一个计划功能,但它在发布的途中被删除了。有关更多信息,请查看此链接 http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspxIs Donut Caching working properly with ASP.NET MVC?。 Oleg 在这里提到的 VaryByParam 选项在您的情况下不是一个好主意。如果您有 VaryByParam,则将为每个不同的参数值(在您的情况下为每个用户名)将不同版本的页面放入缓存中。 就个人而言,我会考虑缓存数据,而不是页面的整个输出。

【讨论】:

    【解决方案2】:

    可能有帮助

    <%@ OutputCache Duration="15" VaryByParam="*" %>
    

    或为VaryByParam 设置其他值。请参阅http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspxhttp://blog.maartenballiauw.be/post/2008/06/Creating-an-ASPNET-MVC-OutputCache-ActionFilterAttribute.aspxhttp://blogs.microsoft.co.il/blogs/gilf/archive/2010/07/18/asp-net-output-cache-provider.aspx

    此外,如果您有不依赖于用户的起始页,则可以将起始页替换为带有空字段(隐藏 div)的非常静态的欢迎页面,而不是“欢迎回来,马特!| 注销”。之后,可以在客户端启动用于填充用户名的 ajax 请求。这种欢迎页面页面可以很好的缓存。

    【讨论】:

    • 在 Matt 的情况下,这意味着对于参数的每个值(在他的情况下是每个用户名),都会将页面的单独版本放入缓存中。
    • 好点,虽然通过 ajax 检索用户名是一个有趣的想法。我还可以尝试从 cookie 中检索用户名,以防止向服务器发出额外请求。
    • 我认为必须避免在 MVC 应用程序中使用 OutputCache 页面指令,而是使用动作过滤器。 :S
    • @Robert 你如何使用动作过滤器来实现这个?
    【解决方案3】:
    【解决方案4】:

    这里有一个解决方法:

    *将OutputCache属性添加到像往常一样管理整个视图的Controller中:

    [OutputCache(Duration = 3600, VaryByParam = "*")]
    public ActionResult Index(FormCollection formCollection)
    {
       //Controller code
    }
    

    *对于你不想做缓存的部分,使用jquery + ajax请求加载它(有自己的控制器,没有OutputCache属性):

    <div id="loginContainer"></div>
    
    $(document).ready(function() {
    
        $.post('controller/action', postdata, function(data) {
    
        if (data.success == true) {
    
            //Populate the container with the obtained data
        }
        });
    
    });
    

    视图将从输出缓存中检索,一旦加载,将执行获取登录信息的请求。希望这是一个非常快速的请求,用户不会注意到延迟。

    【讨论】:

    • 当客户端禁用 JavaScript 时会发生什么?
    【解决方案5】:

    通过 nuget 获取: http://mvcdonutcaching.codeplex.com/

    为 LogOnPartial 添加一个动作,这样你就可以在 _Layout.cshtml 中将它从 Html.Partial 更改为 Html.Action

    @Html.Action("_LogOnPartial","Account",true)
    

    true 是一个排除参数,表示将其从缓存中排除。即使它所在的页面被缓存,该操作也会被调用。这是未缓存的甜甜圈中的“洞”。

    在您的页面上,例如您要缓存的 About.cshtml,应用 DonutOutputCache 属性。这允许新框架在缓存页面时检查页面,并在您已排除操作的位置添加标志。

    好消息是 _LogOnPartial 没有被缓存,并且会为不同的用户刷新,而页面的其余部分被缓存并且 About() 操作不会运行。您甚至可以在使用 DonutOutputCache 属性创建的 _LogOnPartial 操作上配置缓存,但间隔更频繁或更不频繁,或者因其他参数而异。这允许您组合部分页面,并且为每个部分单独配置缓存刷新逻辑。

    IMO 这个工具正是我想象的 MVC 中缓存应该实现的方式。

    【讨论】:

      猜你喜欢
      • 2012-06-02
      • 2011-01-22
      • 2019-05-13
      • 2010-09-27
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多