视图或部分视图可以确定它们是否被缓存吗?

3

我有一个操作,具有以下属性:

  [OutputCache(Location = System.Web.UI.OutputCacheLocation.Server, Duration = 300, VaryByParam = "*")]

还有一个

另一个

  [OutputCache(Location = System.Web.UI.OutputCacheLocation.None)]

它们都使用相同的视图(View)。

在视图(View)中,甚至在Action方法中,我如何确定缓存是什么?即缓存页面是否被缓存?我尝试查看响应头(Response.Headers)(只有"Server: Microsoft-IIS/7.0"),而Response.CacheControl在两种情况下均为"private"。


6
一个视图应该不关心它是否被缓存,对吧? - Mitch Wheat
3
如果这是视图应该知道的内容,那么它不应该被包含在你的模型中吗? - StriplingWarrior
我会说我的主要用途实际上是在 Partial View 中,它会为非成员显示“立即加入”链接,而对于已登录的成员则不会。我在属性中使用了 VaryByCustom。虽然情况比这更复杂一些,但能够在代码中确定缓存属性可以避免我添加到模型中或在代码中重复缓存设置。 - peterorum
1个回答

0

我没有在应用程序中使用过这个,但是为了看是否可能,我做了这个示例... 使用反射和一个基本控制器。从我的操作方法调用Initialize(),以下代码获取调用方法的OutputCache属性。然后,视图或局部视图可以从ViewBag获取缓存位置。

public class BaseController : Controller
{
    public void Initialize()
    {
        var stackTrace = new StackTrace();

        if (stackTrace.FrameCount >= 1)
        {
            var methodBase = stackTrace.GetFrame(1).GetMethod();

            var filters = (OutputCacheAttribute[])methodBase.GetCustomAttributes(typeof(OutputCacheAttribute), false);

            if (filters.Length > 0)
            {
                ViewBag.CacheLocation = filters[0].Location;
            }
        }
    }
}

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