これは、何年にもわたって潜んでいた StackOverflow に関する私の最初の質問です。
MVC4 サイトが既に稼働しています。標準の MVC 機能を使用してすべてうまくいっているサイトにモバイル サポートを追加しています。
ビューの「.Phone」バージョンがない場合に、フレームワークが Layout.cshtml を使用できるようにするコードが必要です。
例 1
次のファイルがあります。
Views/Home/HasBoth.cshtml
Views/Home/HasBoth.Phone.cshtml
Views/Shared/Layout.cshtml
Views/Shared/Layout.Phone.cshtml
デスクトップで呼び出される
- /Home/HasBoth に電話する
- フレームワーク ピックアップはモバイル デバイスではありません
- フレームワークが Layout.cshtml を呼び出す
- フレームワークは HasBoth.cshtml を呼び出します
これは素晴らしい。
携帯で電話
- /Home/HasBoth に電話する
- フレームワークのピックアップはモバイル デバイスです
- フレームワークは Layout.Phone.cshtml を呼び出します
- フレームワークは HasBoth.Phone.cshtml を呼び出します
これもまた素晴らしい。
例 2
次のファイルがあります。
Views/Home/HasNoPhone.cshtml
Views/Shared/Layout.cshtml
Views/Shared/Layout.Phone.cshtml
注: Views/Home/HasNoPhone.Phone.cshtml はありません。
デスクトップで呼び出される
- /Home/HasNoPhone に電話する
- フレームワーク ピックアップはモバイル デバイスではありません
- フレームワークが Layout.cshtml を呼び出す
- フレームワークは HasNoPhone.cshtml を呼び出します
これは素晴らしい。
携帯で電話
- /Home/HasNoPhone に電話する
- フレームワークのピックアップはモバイル デバイスです
- HasNoPhone.Phone.cshtml ビューがないことを解決するためのコードはこちら
- フレームワークがLayout.cshtmlを呼び出す
- フレームワークはHasNoPhone.cshtmlを呼び出します
上記は私が達成したいものです。
編集
使用したソリューション
Zoka のおかげで、私は今、似たようなことをしたい他の人のために以下を使用しています:
ヘルパー メソッド:
/// <summary>
/// Looks to see if the view the exists.
/// </summary>
/// <param name="viewName">The view name.</param>
/// <param name="controllerContext">The controller context.</param>
/// <returns>True if the view exists.</returns>
public static bool ViewExists(string viewName, ControllerContext controllerContext)
{
ViewEngineResult result = ViewEngines.Engines.FindView(controllerContext, viewName, null);
return result.View != null;
}
_ViewStart.cshtml :
@{
Layout = "~/Views/Shared/_Layout.cshtml";
// If a mobile viewing and no <view>.Phone.cshtml file is found set the override to desktop.
// This will ensure _Layout.Phone.cshtml and yyy.Phone.cshtml partials are not called.
string action = (string)ViewContext.Controller.ValueProvider.GetValue("action").RawValue;
string controller = (string)ViewContext.RouteData.Values["Controller"];
string viewPhoneName = "~/Views/" + controller + "/" + action + ".Phone.cshtml";
if (ViewContext.HttpContext.GetOverriddenBrowser().IsMobileDevice &&
MvcHelperAbove.ViewExists(viewPhoneName, ViewContext.Controller.ControllerContext) == false)
{
ViewContext.HttpContext.SetOverriddenBrowser(BrowserOverride.Desktop);
}
}
_Layout.Phone.cshtml
...
@* Below is essential to allow css to work when going from Mobile to Desktop *@
<script>
$(document).ready(function () {
$.mobile.ajaxEnabled = false;
});
</script>
...
ありがとうございました。