私のサイトで気づいたので質問します。iPhone でヒットすると、モバイル ビューが表示される場合もあれば、通常のビューが表示される場合もあります。
MVC 4 は、ブラウザーがモバイル デバイスからのものかどうかを判断するのに特に効果的ではないことも読みましたが、それは本当ですか? もしそうなら、それについて何かできることはありますか?
私のサイトで気づいたので質問します。iPhone でヒットすると、モバイル ビューが表示される場合もあれば、通常のビューが表示される場合もあります。
MVC 4 は、ブラウザーがモバイル デバイスからのものかどうかを判断するのに特に効果的ではないことも読みましたが、それは本当ですか? もしそうなら、それについて何かできることはありますか?
更新: Microsoft は、このバグの回避策パッケージを公開しています。
この回避策をこちらに追加しました。
public class MyDefaultViewLocationCache : DefaultViewLocationCache, IViewLocationCache
{
public MyDefaultViewLocationCache(TimeSpan timeSpan): base(timeSpan)
{
}
public MyDefaultViewLocationCache()
: base()
{
}
public new string GetViewLocation(HttpContextBase httpContext, string key)
{
var location = base.GetViewLocation(httpContext, key);
if (location == null)
{
var cache = httpContext.Cache;
RemoveAllCacheStartWith(key, cache);
}
return location;
}
private static void RemoveAllCacheStartWith(string key, System.Web.Caching.Cache cache)
{
var keyWithoutDisplayMode = key.Substring(0, key.Substring(0, key.Length - 1).LastIndexOf(':') + 1);
var items = new List<string>();
var enumerator = cache.GetEnumerator();
while (enumerator.MoveNext())
{
var _key = enumerator.Key.ToString();
if (_key.StartsWith(keyWithoutDisplayMode))
{
items.Add(_key);
}
}
foreach (string item in items)
{
cache.Remove(item);
}
}
public new void InsertViewLocation(HttpContextBase httpContext, string key, string virtualPath)
{
base.InsertViewLocation(httpContext, key, virtualPath);
}
}
// In App Start
ViewEngines.Engines.OfType<RazorViewEngine>().First().ViewLocationCache =
new MyDefaultViewLocationCache();
詳しくはこちらをご覧ください。