ASP.NET MVC动态片段输出缓存

9
我该如何对整个页面进行缓存,但在页面顶部有一小块内容需要动态更新,例如“欢迎回来,Matt!| 注销”(如果用户已登录)等?
我正在使用ASP.NET MVC 2。

这有时被称为“甜甜圈缓存”,并且不受asp.net mvc 2的支持。https://dev59.com/0k3Sa4cB1Zd3GeqPxbRH - Gabe Moothart
为什么?o_O难道没有其他可行的解决方案吗? - Matthew H
1
我还没有看到过甜甜圈缓存的实现。你可以在控制器中缓存数据,而不是缓存HTML输出。 - Branislav Abadjimarinov
5个回答

6
你想要实现的是所谓的甜甜圈缓存或缓存替换。截至 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,那么对于每个参数值(在你的情况下是每个用户名),缓存中都会放置页面的不同版本。 个人建议缓存数据而不是整个页面的输出。

3

可能有所帮助

<%@ 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)代替“欢迎回来,Matt! | 登出”。之后,可以在客户端开始一个用于填充用户名的 ajax 请求。这种欢迎页面可以被很好地缓存。


在马特的情况下,这意味着页面的每个参数值(在他的情况下是每个用户名)都将有一个单独的版本被放入缓存中。 - Branislav Abadjimarinov
1
不错的想法,虽然通过ajax检索用户名是一个有趣的想法。我也可以尝试从cookie中检索用户名,以避免向服务器发出额外的请求。 - Matthew H
1
我认为在MVC应用程序中,必须避免使用OutputCache页面指令,而应该使用操作过滤器。 :S - Robert Koritnik
@Robert 你会如何使用动作过滤器来实现这个功能? - AaronLS

0
这里有一个解决方案的变通方法:
*像往常一样,将OutputCache属性添加到管理整个视图的控制器中:
[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时会发生什么? - Chase Florell

0

通过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操作的缓存,但更频繁或更少的间隔,或者根据其他参数变化。这允许您组合部分页面,并且每个部分的缓存刷新逻辑都是独立配置的。

我认为这个工具正是我想象中MVC中应该实现的缓存。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接