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

时间:2010-07-26 22:05:15

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

如果用户登录等等,我怎么能缓存整个页面,除了位于顶部的位置"Welcome back, Matt! | Log Out"之外的东西?

我正在使用ASP.NET MVC 2.

5 个答案:

答案 0 :(得分: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,则会为缓存中的每个不同参数值(在您的情况下为每个用户名)放置不同版本的页面。 我个人认为缓存数据,而不是页面的整个输出。

答案 1 :(得分: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)而不是“欢迎回来,马特!|退出”。之后,可以在客户端开始填写用户名的ajax请求。这种欢迎页面可以很好地缓存。

答案 2 :(得分:0)

答案 3 :(得分:0)

这里有解决方案:

*将OuptutCache属性添加到通常管理整个视图的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
    }
    });

});

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

答案 4 :(得分:0)

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

为LogOnPArtial添加操作,因此您可以将其从Html.Partial更改为_Layout.cshtml中的Html.Action

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

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

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

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

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