Итак, я взял минуту и посмотрел на источник MVC 3. Первое, что пришло мне в голову, было то, что эта функция казалась немного хакерской. Главным образом потому, что они повторно используют атрибут, который работает в одной ситуации, соблюдая все свойства и параметры конфигурации, а затем в сценарии дочернего действия просто игнорируя все эти параметры и позволяя только VaryByParam и Duration .
Как понять, что поддерживается, мне не под силу. Потому что исключение, которое они хотят сгенерировать и которое говорит Неподдерживаемая настройка , никогда не будет выброшено, если вы не указали длительность и значение VaryByParam
Вот основной фрагмент кода, который пахнет:
if (Duration <= 0) {
throw new InvalidOperationException(MvcResources.OutputCacheAttribute_InvalidDuration);
}
if (String.IsNullOrWhiteSpace(VaryByParam)) {
throw new InvalidOperationException(MvcResources.OutputCacheAttribute_InvalidVaryByParam);
}
if (!String.IsNullOrWhiteSpace(CacheProfile) ||
!String.IsNullOrWhiteSpace(SqlDependency) ||
!String.IsNullOrWhiteSpace(VaryByContentEncoding) ||
!String.IsNullOrWhiteSpace(VaryByHeader) ||
_locationWasSet || _noStoreWasSet) {
throw new InvalidOperationException(MvcResources.OutputCacheAttribute_ChildAction_UnsupportedSetting);
}
Я не уверен, почему это не вызвано в документации , но даже если это был API, это должно прояснить или, по крайней мере, выдать правильное исключение.
Короче говоря, частичное кэширование вывода работает, НО не так, как вы этого хотели бы. Я поработаю над исправлением кода и выполнением некоторых настроек, таких как enabled .
Обновление:
Я исправил текущую реализацию, чтобы она работала, по крайней мере, в моей ситуации с соблюдением флага включения и разрешением профилей кэша из файла web.config. Подробно в моем блоге.