2012-03-07 17 views
12

Pracuję nad uaktualnieniem aplikacji z MVC3 do MVC4 i zauważyłem coś, co założyłem (mam nadzieję?) "Po prostu zadziała".ASP.Net MVC4 Mobile-Aware OutputCache

KOD:

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

Jest to podręcznik buforowanie przykład dla ASP.NET. Za każdym razem, gdy przeglądarka trafi na stronę, sprawdza pamięć podręczną, aby sprawdzić, czy coś istnieje, generuje widok, jeśli nie, a następnie wysyła wyniki z pamięci podręcznej.

Działa to świetnie; jednakże, bawiąc się funkcjonalnością MVC4 w widoku mobilnym, zauważyłem, że powyższy kod nie sprawdza, czy żądanie pochodzi z urządzenia mobilnego. Jeśli więc trafię tę trasę na pulpit, widok pulpitu będzie wyświetlany na moim telefonie, dopóki pamięć podręczna nie zostanie unieważniona. Odwrotna sytuacja również jest prawdą (jeśli najpierw uderzę w stronę z telefonem, zamiast tego na pulpicie pojawi się widok mobilny).

Czy istnieje parametr, który mógłbym użyć, aby działało to tak, jak miałem nadzieję, czy też szukam budowania klienta OutputCacheProvider?

Odpowiedz

25

Po nieco większym kopaniu znalazłem rozwiązanie tego problemu.

Aktualizacja Kontroler Akcja

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

Zastąp GetVaryByCustomString w 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); 
} 
+0

Bardzo interesujące Mam si Milar problem, dzięki! – Pelle

+1

Przełączanie na widok pulpitu nie działa z tym kodem. Strona po prostu odświeża się zamiast przełączać. Zamiast tego należy użyć context.GetVaryByCustomStringForOverriddenBrowser(). –

5

Jest to metoda Prawidłowe GetVaryByCustomString

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