2012-03-07 12 views
12

私はMVC3からMVC4へのアプリケーションのアップグレードに取り組んでいます。ASP.Net MVC4 Mobile-Aware OutputCache

CODE:

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

これは、ASP.Netのための一例をキャッシュ教科書です。ブラウザがページにヒットするたびに、キャッシュが存在するかどうかを確認し、存在しない場合はビューを生成し、キャッシュされた結果を送信します。

これは素晴らしい動作です。しかし、MVC4のモバイルビュー機能を使いこなしてみると、上記のコードは、リクエストがモバイルデバイスからのものかどうかをチェックしていないことに気付きました。したがって、デスクトップ上のそのルートに当たった場合、キャッシュが無効になるまでデスクトップビューが私の電話機に表示されます。逆の場合も同様です(最初に電話でページを表示すると、代わりにモバイルビューが表示されます)。

私は期待どおりのこの作業を行うために使用できるパラメータがありますか、または顧客のOutputCacheProviderの構築を検討していますか?

答えて

25

もう少し掘り下げてから、問題の解決策を見つけました。

Global.asaxの中の更新コントローラのアクション

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

オーバーライドGetVaryByCustomString

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom.ToLowerInvariant() == "ismobile" && context.Request.Browser.IsMobileDevice) 
    { 
     return "mobile"; 
    } 
    return base.GetVaryByCustomString(context, custom); 
} 
+0

非常に興味深い、私がいますシミラの問題、ありがとう! – Pelle

+1

デスクトップビューに切り替えることはこのコードでは機能しません。このページは、切り替えの代わりに単に更新されます。 context.GetVaryByCustomStringForOverriddenBrowser()を代わりに使用してください。 –

5

これは正しいGetVaryByCustomString方法

public override string GetVaryByCustomString(HttpContext context, string custom) 
    { 
     if (custom.ToLowerInvariant() == "ismobile") 
     { 
      return context.GetVaryByCustomStringForOverriddenBrowser(); 
     } 
     return base.GetVaryByCustomString(context, custom); 
    } 
関連する問題