如果用户登录等等,我怎么能缓存整个页面,除了位于顶部的位置"Welcome back, Matt! | Log Out"
之外的东西?
我正在使用ASP.NET MVC 2.
答案 0 :(得分:6)
您要实现的目标称为甜甜圈缓存或缓存替换。从ASP.NET MVC 2开始,没有内置的帮助程序来支持这种情况。据我所知,它是MVC v.1中的计划功能,但它在发布的某个地方被删除了。有关详情,请查看此链接http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx,Is 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.aspx,http://blog.maartenballiauw.be/post/2008/06/Creating-an-ASPNET-MVC-OutputCache-ActionFilterAttribute.aspx和http://blogs.microsoft.co.il/blogs/gilf/archive/2010/07/18/asp-net-output-cache-provider.aspx。
此外,如果你有一个非用户依赖的起始页面,可以用一个非常静态的欢迎页面替换起始页面,空白字段(隐藏div)而不是“欢迎回来,马特!|退出”。之后,可以在客户端开始填写用户名的ajax请求。这种欢迎页面可以很好地缓存。
答案 2 :(得分:0)
不支持!=不可能
http://www.klopfenstein.net/lorenz.aspx/output-donut-caching-attribute-asp-net-mvc-partial-requests
http://haacked.com/archive/2009/05/12/donut-hole-caching.aspx
答案 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中的缓存应该已经实现。