我怎么能缓存整个页面,除了顶部的一点,它说明"Welcome back, Matt! | Log Out"
了用户是否登录等等?
我正在使用 ASP.NET MVC 2。
我怎么能缓存整个页面,除了顶部的一点,它说明"Welcome back, Matt! | Log Out"
了用户是否登录等等?
我正在使用 ASP.NET MVC 2。
您要实现的目标称为甜甜圈缓存或缓存替换。从 ASP.NET MVC 2 开始,没有内置的帮助程序来支持这种情况。据我所知,这是 MVC v.1 中的一个计划功能,但在发布的过程中被删除了。有关更多信息,请查看此链接http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx,Donut Caching 是否与 ASP.NET MVC 一起正常工作?. Oleg 在这里提到的 VaryByParam 选项在您的情况下不是一个好主意。如果您有 VaryByParam,则将为每个不同的参数值(在您的情况下为每个用户名)将不同版本的页面放入缓存中。就个人而言,我会考虑缓存数据,而不是页面的整个输出。
可能有帮助
<%@ 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 请求。这种欢迎页面页面可以很好的缓存。
在这里,您有一个解决方法:
*将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
}
});
});
视图将从输出缓存中检索,一旦加载,将执行获取登录信息的请求。希望这将是一个非常快速的请求,并且用户不会注意到延迟。
通过 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 中缓存应该实现的方式。
Not Supported != Not Possible
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