ASP.Net MVC4 Mobile-Aware OutputCache - PullRequest
12 голосов
/ 07 марта 2012

Я работаю над обновлением приложения с MVC3 до MVC4 и заметил кое-что, что, как я предполагал (надеюсь?), Будет "просто работать".

КОД:

[OutputCache(Duration = 600, VaryByParam = "none")]
public ActionResult Index()
{
   return View();
}

Этопример кэширования учебника для ASP.Net.Всякий раз, когда браузер просматривает страницу, он проверяет кэш, чтобы увидеть, существует ли что-то, генерирует представление, если нет, и затем отправляет кэшированные результаты.

Это прекрасно работает;однако, играя с функциональностью Mobile View в MVC4, я заметил, что приведенный выше код не проверяет, был ли Запрос с мобильного устройства.Поэтому, если я попаду по этому маршруту на рабочем столе, представление на рабочем столе будет отображаться на моем телефоне, пока кэш не станет недействительным.Обратное также верно (если я сначала нажму на страницу с телефоном, рабочий стол тогда увидит мобильное представление).

Есть ли параметр, который я мог бы использовать, чтобы сделать эту работу, как я надеялся, илия смотрю на создание клиента OutputCacheProvider?

Ответы [ 2 ]

25 голосов
/ 07 марта 2012

После еще нескольких копаний я нашел решение проблемы.

Обновленное действие контроллера

[OutputCache(Duration = 600, VaryByCustom = "IsMobile")]
public ActionResult Index()
{
   return View();
}

Переопределение GetVaryByCustomString в Global.asax

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    if (custom.ToLowerInvariant() == "ismobile" && context.Request.Browser.IsMobileDevice)
    {
        return "mobile";
    }
    return base.GetVaryByCustomString(context, custom);
}
5 голосов
/ 04 января 2013

Это правильный метод GetVaryByCustomString

public override string GetVaryByCustomString(HttpContext context, string custom)
    {
        if (custom.ToLowerInvariant() == "ismobile")
        {
            return context.GetVaryByCustomStringForOverriddenBrowser();
        }
        return base.GetVaryByCustomString(context, custom);
    }
...