1

これは、何年にもわたって潜んでいた 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

デスクトップで呼び出される

  1. /Home/HasBoth に電話する
  2. フレームワーク ピックアップはモバイル デバイスではありません
  3. フレームワークが Layout.cshtml を呼び出す
  4. フレームワークは HasBoth.cshtml を呼び出します

これは素晴らしい。

携帯で電話

  1. /Home/HasBoth に電話する
  2. フレームワークのピックアップモバイル デバイスです
  3. フレームワークは Layout.Phone.cshtml を呼び出します
  4. フレームワークは HasBoth.Phone.cshtml を呼び出します

これもまた素晴らしい。

例 2

次のファイルがあります。

Views/Home/HasNoPhone.cshtml

Views/Shared/Layout.cshtml
Views/Shared/Layout.Phone.cshtml

注: Views/Home/HasNoPhone.Phone.cshtml はありません。

デスクトップで呼び出される

  1. /Home/HasNoPhone に電話する
  2. フレームワーク ピックアップはモバイル デバイスではありません
  3. フレームワークが Layout.cshtml を呼び出す
  4. フレームワークは HasNoPhone.cshtml を呼び出します

これは素晴らしい。

携帯で電話

  1. /Home/HasNoPhone に電話する
  2. フレームワークのピックアップモバイル デバイスです
  3. HasNoPhone.Phone.cshtml ビューがないことを解決するためのコードはこちら
  4. フレームワークがLayout.cshtmlを呼び出す
  5. フレームワークは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>
...    

ありがとうございました。

4

2 に答える 2

0

あなたの質問を理解しているので、いくつかのビューが存在するかどうかを調べる必要があります。ビューからアクセス可能なクラスに配置されたそのような関数を使用します。

public static bool ViewExists(string _name, ControllerContext _controller_context)
{
    ViewEngineResult result = ViewEngines.Engines.FindView(_controller_context, _name, null);
    return (result.View != null);
}

次に、これを _ViewStart.cshtml に入れます。

string action = (string)ViewContext.Controller.ValueProvider.GetValue("action").RawValue;
string controller = (string)ViewContext.RouteData.Values["Controller"];
var viewPhoneName = "~/Views/" + controller + "/" + action + ".Phone.cshtml";
if (YourNamespaceAndClassForAboveHelper.ViewExists(viewPhoneName, ViewContext.Controller.ControllerContext)) {
    Layout = "~/Views/Shared/Layout.Phone.cshtml"
} else {
    Layout = "~/Views/Shared/Layout.cshtml"
}

そして最後に Layout.cshml (それぞれ Layout.Phone.cshtml) で、呼び出しの代わりにRenderBody

string action = (string)ViewContext.Controller.ValueProvider.GetValue("action").RawValue;
string controller = (string)ViewContext.RouteData.Values["Controller"];
@RenderPage("~/Views/" + controller + "/" + action + ".cshtml"); @* .Phone.cshtml in Layout.Phone.cshtml *@
于 2013-04-12T11:34:51.697 に答える
0

既存の jquery モバイル パッケージを使用できます。

http://www.hanselman.com/blog/MakingASwitchableDesktopAndMobileSiteWithASPNETMVC4AndJQueryMobile.aspx

編集:ページインストーラーを使用して、ページをコンテナーに登録することもできます。そうすれば、コントローラーはコンテナにどのビューを返すべきかを尋ねることができます。

WindsorViewPageActivator の作成

于 2013-04-12T12:02:00.083 に答える