ASP NET MVC OutputCache VaryByParam сложные объекты

Вот что у меня есть:

[OutputCache(Duration = 3600, VaryByParam = "model")]
public object Hrs(ReportFilterModel model) {
    var result = GetFromDatabase(model);
    return result;
}

Я хочу, чтобы он кешировал новый результат для каждой модели. В настоящий момент он кэширует первый результат и даже при изменении модели возвращает тот же результат.

Я даже пытался переопределить методы ToString и GetHashCode для ReportFilterModel. На самом деле у меня есть еще несколько свойств, которые я хочу использовать для создания уникальных HashCode или String.

public override string ToString() {
    return SiteId.ToString();
}

public override int GetHashCode() {
    return SiteId;
}

Есть предложения, как я могу заставить сложные объекты работать с OutputCache?


person Jaanus    schedule 22.05.2015    source источник


Ответы (1)


Значение VaryByParam из MSDN: список строк, разделенных точкой с запятой, которые соответствуют значениям строки запроса для метода GET или значениям параметров для метода POST.

Если вы хотите изменить кэш вывода по всем значениям параметров, установите для атрибута звездочку (*).

Альтернативный подход состоит в создании подкласса OutputCacheAttribute и пользовательского отражения для создания строки VaryByParam. Что-то вроде этого:

 public class OutputCacheComplex : OutputCacheAttribute
    {
        public OutputCacheComplex(Type type)
        {
            PropertyInfo[] properties = type.GetProperties();
            VaryByParam = string.Join(";", properties.Select(p => p.Name).ToList());
            Duration = 3600;
        }
    }

И в Контроллере:

[OutputCacheComplex(typeof (ReportFilterModel))]

Для получения дополнительной информации: Как использовать VaryByParam с несколькими параметрами?

https://msdn.microsoft.com/en-us/library/system.web.mvc.outputcacheattribute.varybyparam(v=vs.118).aspx

person Daniel Stackenland    schedule 22.05.2015
comment
Это мне не совсем помогает, как там сложные объекты использовать? - person Jaanus; 22.05.2015
comment
Вы не можете использовать свой сложный объект, но вы можете установить VaryByParam = propname1; propname2; propname3, предполагая, что он опубликован или в строке запроса - person Daniel Stackenland; 22.05.2015
comment
Обновил свой ответ, это больше похоже на то, что вы ищете? - person Daniel Stackenland; 22.05.2015
comment
Вы хотите сказать, что если я определю свойство кеша, например VaryByParam = "siteId", то оно будет использовать свойство моего сложного объекта model siteId? - person Jaanus; 22.05.2015
comment
Нет, я говорю, что браузер отправляет siteId как значение строки запроса или как поле формы в зависимости от http-метода (post или get). Привязка модели ASP использует эти значения для создания вашей модели, и вы также можете использовать те же значения для управления кэшированием вывода. - person Daniel Stackenland; 22.05.2015