在我的ASP.NET MVC项目中,我在共享_Layout.cshtml文件的导航菜单中有一个登录子菜单,如果用户已登录则显示用户信息,如果没有,则显示注册/登录选项.登录子菜单是我的共享文件夹中的部分视图,名为_LoginPartial:
@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
//display <ul> with user profile settings, omitted for brevity
}
else
{
//display <ul> to signup/login, omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
虽然我大量缓存各种控制器的几个动作,但我想实现甜甜圈缓存,_Layout以便_LoginPartial不会被缓存,原因显而易见.我正在使用mvcdonutcaching库来完成这个(在这个答案中建议),它提供了一些@Html.Action具有附加bool excludeFromParentCache属性的重载.
因此,我创建了LayoutController一个UserAuth返回的动作_LoginPartial:
public class LayoutController : Controller
{
[ChildActionOnly]
public ActionResult UserAuth()
{
return PartialView("_LoginPartial");
}
}
Run Code Online (Sandbox Code Playgroud)
..在我_Layout想要_LoginPartial出现的文件中,我将mvcdonutcaching Html.Action重载称为:
@Html.Action("UserAuth", "Layout", true)
Run Code Online (Sandbox Code Playgroud)
为了测试这个,我OutputCache在 …
ASP.NET MVC 3(最终版)今天发布.当这个版本处于起步阶段时,我记得在codeplex上阅读正在考虑的环形缓存.有谁知道这是否成为V3?我似乎无法找到任何信息,所以我只能(遗憾地)认为它没有发生.
我试图让[ CompressFilter ]使用甜甜圈缓存并遇到问题.
会发生什么是整个页面被缓存而不仅仅是甜甜圈.CompressFilter我使用的来源如下.我将其从原始源更改为使用OnResultExecuted而不是OnActionExecuting()因为我需要访问结果的类型以避免缓存某些ActionResult子类.
看看实际的MVC v1源代码OutputCacheAttribute看起来它也在使用OnResultExecuted(),但我不认为这个事实直接导致冲突.
我不太清楚替换缓存是如何工作的,以了解其行为方式.我认为值得注意的是,这并不会导致任何类型的损坏显示.它只是表现得没有甜甜圈!
它看起来像我将不得不使用某种IIs'插件'来处理缓存,我真的想避免这样做,但它看起来我也需要甜甜圈缓存.
我现在更感兴趣的是知道它为什么会产生这种效果,但如果可能的话,解决方案也会很棒.
public class CompressFilter : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
HttpRequestBase request = filterContext.HttpContext.Request;
// dont encode images!
if (filterContext.Result is ImageResult)
{
return;
}
string acceptEncoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding)) return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
if (acceptEncoding.Contains("GZIP"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter …Run Code Online (Sandbox Code Playgroud) 我有一个定义了以下缓存的页面:
<%@ OutputCache Duration="60" VaryByParam="None" %>
Run Code Online (Sandbox Code Playgroud)
我在该页面中有一个用户控件,我不想缓存.如何才能为该控件关闭它?
我的网站页面由两种内容组成.第一个是用户之间的变量,但对于所有页面都是常量.第二个是跨用户不变的,但在页面之间是可变的.这是一种常见的布局.将输出缓存应用于此类内容的最佳方法是什么?
据我了解,Html.Substitute助手与MVC2渲染管道不兼容,消除了旧的圆环缓存方式.
特异性水平会降低输出缓存的价值.同一用户不太可能在缓存输出的生命周期内多次查看同一页面.
互联网上有几次尝试,它们修改OutputCache属性并渲染子系统以支持替换.我发现的最好的就是这里.
但是,我发现的各种片段似乎都是非正式的实现,并且得不到很好的支持.另外,我倾向于怀疑如果将替换添加回MVC2管道那么容易,那就完成了.
action方法不会使用OutputCache属性进行标记,并且会返回一个包含多个Html.RenderAction调用的视图,这些调用将独立地引入缓存的内容.除了使用稍微重量级的含义之外RenderAction,它还会增加额外的间接层和代码味道.
您在MVC2中独立编写缓存内容的经历是什么?什么运作良好,什么没有?
outputcache partial-views donut-caching renderaction asp.net-mvc-2
有人可以为甜甜圈缓存指出几个高质量的教程/页面吗?就像网络上的其他内容一样,你可以搜索一百万条内容,但我发现的一些文章有点令人困惑.
我在找
我有一个使用该OutputCache属性修饰的ASP.NET MVC操作,但问题是MiniProfiler输出也被缓存.我想从缓存(圆环孔)中排除MiniProfiler输出,但我不确定如何排除像MiniProfiler.RenderIncludes()之类的调用.
谁碰巧知道我怎么做到这一点?
我见过的甜甜圈缓存的所有例子都是这样的:
<%= Html.Substitute( c => DateTime.Now.ToString() )%>
Run Code Online (Sandbox Code Playgroud)
如果我只想要约会,那很好,但还有其他选择吗?
我知道有一个委托'MvcSubstitutionCallback',它有以下签名:
public delegate string MvcSubstitutionCallback(HttpContextBase httpContext);
Run Code Online (Sandbox Code Playgroud)
但RenderAction并RenderPartial返回void,所以我不能只是从委托方式回报他们.如何在更复杂的情况下有效地使用此回调.
我想使用甜甜圈缓存的替换功能.
public static string GetTime(HttpContext context)
{
return DateTime.Now.ToString("T");
}
Run Code Online (Sandbox Code Playgroud)
...
The cached time is: <%= DateTime.Now.ToString("T") %>
<hr />
The substitution time is:
<% Response.WriteSubstitution(GetTime); %>
Run Code Online (Sandbox Code Playgroud)
...但我想在HttpContext旁边传递额外的参数到回调函数.
所以问题是:
如何将额外的参数传递给GetTime回调?
例如,像这样:
public static string GetTime(HttpContext context, int newArgument)
{
// i'd like to get sth from DB by newArgument
// return data depending on the db values
// ... this example is too simple for my usage
if (newArgument == 1)
return "";
else
return DateTime.Now.ToString("T");
}
Run Code Online (Sandbox Code Playgroud) 我Html.RenderAction<CartController>(c => c.Show());在我的主页面上使用显示所有页面的购物车.问题是当我将一个项目添加到购物车然后点击浏览器后退按钮时.它显示旧购物车(来自Cache),直到我点击刷新按钮或导航到另一个页面.
我已经尝试了这个并且它完美地工作但是它为我的站点中的所有页面全局禁用了全局缓存(因为这个Action方法在主页面上使用).出于性能原因,我需要为其他几个部分视图(操作方法)启用缓存.
我不想在页面加载时使用带有AJAX的客户端脚本刷新购物车(和登录视图) - 但这是我现在能想到的唯一解决方案.
有谁知道更好吗?
虽然我们在Substitution控件中使用的方法应该返回字符串,那么如何在服务器控件上使用web表单中的donut缓存呢?
例如Loginview控件?
我有一个个人资料图片上传页面,用户可以在其中覆盖他们之前的个人资料图片.
但是当我将用户返回到他们的个人资料页面时,浏览器已缓存他们之前的图像,只有F5刷新返回新图像.
是否可以阻止浏览器缓存图像,因为有些用户可能认为他们的新上传失败了.
理想情况下,我只想阻止图像被缓存.但是快速浏览甜甜圈缓存似乎表明它不可能在MVC2中做到......?
谢谢你的任何指示.
model-view-controller caching image donut-caching asp.net-mvc-2
donut-caching ×12
caching ×6
asp.net ×5
asp.net-mvc ×4
c# ×2
outputcache ×2
.net-4.0 ×1
image ×1
page-caching ×1
renderaction ×1
substitution ×1
webforms ×1