Настройка кэширования подмакета в Sitecore

При использовании WebControls в Sitecore есть способ настроить поведение кэширования — переопределить метод GetCachingID. Есть ли способ добиться чего-то подобного с помощью Sublayouts (UserControls)? Я хотел бы добавить пользовательские параметры «VaryBy» (пример — «Vary By Moon Position»).


person Alexander Doroshenko    schedule 14.04.2011    source источник


Ответы (1)


Да, кэширование подмакета по умолчанию может различаться по нескольким критериям. Для этого можно использовать различные параметры. Различия:

  • Варьировать по данным
  • Зависит от устройства
  • Варьировать по логину
  • Варьировать по параметрам
  • Зависит от строки запроса
  • Зависит от пользователя

Подход, который вы можете настроить здесь, — «Варьировать по параметрам», и ВЫ определяете, какие параметры есть. Вы можете сделать это в «Сведениях о презентации», где вы динамически назначаете подмакет элементу (внизу свойств элемента управления есть раздел для определения параметров), или вы можете установить это с помощью кода C#. Вот пример использования кода C# для статического назначения подмакета моему макету:

<h1>My website</h1>
<h2>My site is great</h2>
<sc:Sublayout ID="slMyControl" path="~/path/to/my/control.ascx" VaryByParm="true" Cachable="true" runat="server" />

(В приведенном выше коде следует отметить одну вещь: атрибут VaryByParam на самом деле равен VaryByParm в Sitecore, что, очевидно, является опечаткой в ​​их коде.)

Теперь в C# задайте параметры программно:

slMyControl.Parameters = "myKey1=MyVal1&myKey2=myVal2";

Если вы можете получить положение Луны в C#, то преобразуйте его в строку и присвойте параметрам:

slMyControl.Parameters = "position=" + getMoonPosition().ToString();

Недавно я кэшировал календарь по месяцам и годам, которые появляются в строке запроса. Простой пример без обработки ошибок:

slEventCalendar.Parameters = string.Format("m={0}&y={1}", Request.QueryString["m"], Request.QueryString["y"]);

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

person Mark Ursino    schedule 15.04.2011
comment
Именно то, что мне нужно. Спасибо! - person Alexander Doroshenko; 15.04.2011
comment
Привет Марк. Что делать, если элемент управления ‹sc:Sublayout› не встроен в основной макет? Вместо этого у меня есть UserControl, назначенный PlaceHolder. Другими словами, я не знаю и не имею доступа к элементу управления Sublayout из моего макета. Любые мысли о том, как применить это решение к этому сценарию? - person Mike M; 21.03.2013
comment
Я видел ваш ответ на этот другой пост. stackoverflow.com/ вопросов/10514052/ Может быть, это было бы решением? - person Mike M; 21.03.2013
comment
Вы можете создать вложенный макет с помощью C#: Sublayout sl = new Sublayout();, а затем использовать C#, чтобы добавить его в заполнитель: ph.Controls.Add(sl); - person Mark Ursino; 23.03.2013