ASP.NET MVC OutputCacheAttribute:如果设置了参数,请不要缓存?

时间:2010-01-06 12:05:27

标签: asp.net-mvc caching outputcache

我有以下行动:

public class HomeController : Controller
{
    public ActionResult Index(int? id) { /* ... */ }
}

我想[OutputCache]这个动作,但我也喜欢这样:

  • 如果id == null,则不使用缓存;或
  • 如果id == null使用缓存,但持续时间不同。

我想我可以通过以下方式实现这一目标:

public class HomeController : Controller
{
    [OutputCache(VaryByParam = "none", Duration = 3600)]
    public ActionResult Index() { /* ... */ }

    [OutputCache(VaryByParam = "id", Duration = 60)]
    public ActionResult Index(int id) { /* ... */ }
}

但是,当id实际上是可选的时,此解决方案意味着2个操作,因此这可能会创建一些代码重复。当然我可以做点像

public class HomeController : Controller
{
    [OutputCache(VaryByParam = "none", Duration = 3600)]
    public ActionResult Index() { return IndexHelper(null); }

    [OutputCache(VaryByParam = "id", Duration = 60)]
    public ActionResult Index(int id) { return IndexHelper(id); }

    private ActionResult IndexHelper(int? id) { /* ... */ }
}

但这看起来很难看。

你会如何实现这个?

1 个答案:

答案 0 :(得分:3)

我认为你所拥有的可能是最干净的选择。

我还没有测试过的另一个选项可能是设置VaryByCustom参数并覆盖Global.asax中的GetVaryByCustomString。

public override string GetVaryByCustomString(HttpContext context, string arg)
{
    if (arg.ToLower() == “id”)
    {
        // Extract and return value of id from query string, if present.
    }

    return base.GetVaryByCustomString(context, arg);
}

有关详细信息,请参阅此处:http://codebetter.com/blogs/darrell.norton/archive/2004/05/04/12724.aspx