Как настроить выпадающий список кендо для использования кеша?

В моем приложении есть раскрывающийся список кендо для отображения состояний. Выпадающий список состояния использовался в нескольких представлениях.

@(Html.Kendo().DropDownListFor(m => m.BlankReturn.StateProvinceCode)
                .DataTextField("StateName")
                .DataValueField("StateCode")
                .DataSource(source =>
                {
                    source.Read(read =>
                    {
                        read.Action("GetStateProvinces", "Lookup");
                    });
                })                
            )

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

Update1
Несколько ответов ниже предлагают использовать кэширование на стороне сервера. Я искал кэширование на стороне клиента. Например, метод ajax jQuery будет кэшировать результат метода GET (если вы явно не отключили кэширование). Я предполагаю, что Kendo использует jQuery для внутреннего вызова сервера. Однако я думаю, что кендо отключает кэширование ajax. Таким образом, кендо каждый раз заставляет сервер обращаться к результату. Мой вопрос заключается в том, как включить кэширование на стороне клиента, чтобы после первого вызова не было никакого вызова сервера.


person LP13    schedule 26.10.2016    source источник
comment
Взгляните на stackoverflow.com/questions/8205637/ или stackoverflow.com/questions/22443932/. Я думаю, это то, чем занимается IIS, а не кендо.   -  person The Dread Pirate Stephen    schedule 26.10.2016
comment
Используйте [OutputCacheAttribute], если вы не используете сторонние API для кэша.   -  person Vijai    schedule 27.10.2016


Ответы (1)


Ответ не связан с кендо. Если вы используете MVC, вы можете либо загрузить коллекцию состояний из System.Web.Cache, либо использовать атрибуты метода кэширования .net MVC.

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

using System.Web;
public ActionResult GetStates()
{
    List<State> states=(List<State>)System.Web.HttpContext.Current.Cache["MY_STATES"];
    if(states==null)
    {
        states=myDataLayer.LoadStates();

        System.Web.HttpContext.Current.Cache.Insert(
              "MY_STATES", 
               states, 
               null, 
               System.Web.Caching.Cache.NoAbsoluteExpiration, 
               new TimeSpan(0,1440,0), 
               System.Web.Caching.CacheItemPriority.Normal, 
               null);         
    }
    return states;
}

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

[OutputCache(Duration = 86400)]
public ActionResult GetStates()
{
    return myDataLayer.LoadStates();
}

Атрибуты метода MVC — Единая конфигурация – Установите атрибуты кэша браузера.

[OutputCache(CacheProfile = "TypeTableCacheProfile")]
public ActionResult GetStates()
{
    return myDataLayer.LoadStates();
}

вместе с конфигом

  <system.web>
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <clear />
          <!-- 24 hours-->
          <add varyByParam="*" duration="86400" name="TypeTableCacheProfile" />          
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
 </system.web>
person Ross Bush    schedule 27.10.2016
comment
Атрибут OutputCacheAttribute должен инициировать кэширование на стороне клиента. По сути, он сообщает браузеру о кеше первого запроса, подобном этому, а затем при последующих запросах клиент будет следовать инструкциям, предоставленным первым запросом, и не будет делать запрос (если это указано в инструкциях по кэшированию первого запроса). - person The Dread Pirate Stephen; 27.10.2016