ASP.NET MVC OutputCacheAttribute: не кэшировать, если задан параметр? - PullRequest
3 голосов
/ 06 января 2010

У меня есть следующее действие:

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) { /* ... */ }
}

Однако это решениеподразумевает 2 действия, когда id фактически необязателен, так что это может создать некоторое повторение кода.Конечно, я мог бы сделать что-то вроде

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 Ответ

3 голосов
/ 06 января 2010

Я думаю, что у вас, наверное, самый чистый вариант.

Другой вариант, который я не тестировал, может заключаться в установке параметра VaryByCustom и переопределении GetVaryByCustomString в Global.asax.

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

...