4

この記事を使用して、サイトのメイン ページのモバイル バージョンに取り組んでいます

HomeController と EventController の 2 つのコントローラーがあります。

HomeController には Index ビューがあり、EventController には詳細ビューがあります。

_Layout.mobile.cshtml を正しく使用する Index.mobile.cshtml ビューを作成できました。ユーザーが携帯電話で mysite.com/Home/Index にアクセスすると、モバイル バージョンが正しく表示されるようになりました。

ここで、同じユーザーが mysite.com/Event/Detail/123 にアクセスすると、デフォルトの「デスクトップ」ビューが表示されると予想していました ( Detail.mobile.cshtml ビューはありません)。

問題は、Detail.cshtml ビューが実際に呼び出されることですが、_Layout.mobile.cshtml レイアウトを使用しようとするため、ページの見栄えが悪くなります。

これを実現する方法はありますか (モバイルに実装していないデスクトップ レイアウトを使用してデスクトップ ビューをレンダリングするだけです)。

ありがとう!

4

4 に答える 4

1

以前はこのNUGET Pakageを使用していませんでしたが、次の点に注意してください。

デフォルトでは、デスクトップとモバイルを切り替えることができますが、モバイル デバイスでのみ可能です。なんで?コードの最初の行を確認してください。コードは、次のように最初にモバイル デバイスをチェックします。

@if (Request.Browser.IsMobileDevice && Request.HttpMethod == "GET")
{
    <div class="view-switcher ui-bar-a">
        @if (ViewContext.HttpContext.GetOverriddenBrowser().IsMobileDevice)
        {
            @: Displaying mobile view
            @Html.ActionLink("Desktop view", "SwitchView", "ViewSwitcher", new { mobile = false, returnUrl = Request.Url.PathAndQuery }, new { rel = "external" })
        } 
        else 
        {
            @: Displaying desktop view
            @Html.ActionLink("Mobile view", "SwitchView", "ViewSwitcher", new { mobile = true, returnUrl = Request.Url.PathAndQuery }, new { rel = "external" })
        }
    </div>
}

MSDNによると:

一般に、ビューにロジックを含めないようにすることをお勧めします。発見するのが難しく、テストするのがさらに難しい場合があります。代わりに、ビュー内のロジックをビュー モデルまたはコントローラー アクションに移動する必要があります。

問題解決:必要に応じてデフォルト ロジックを変更します。目的に合わせてビューをトレースする (ビューでもブレーク ポイントが機能する) ことが考えられます。

MVC と名前付きパッケージも併せて認識するために、この MSDN トピックを参照する必要があります。アクションで何が起こるかを理解することで、問題を解決できます。

于 2013-11-10T08:48:02.083 に答える
1

このコード行をコントローラ アクションに配置することで、ビューごとにこの問題を解決できるようです。

HttpContext.SetOverriddenBrowser(BrowserOverride.Desktop);

ただし、私が本当に欲しいのは、現在のビューの名前/パスに .Mobile がない場合、レイアウトを .Mobile バージョンに切り替えないでくださいという基本的なソリューションです。

于 2013-11-08T14:32:42.430 に答える
0

最も簡単な解決策は、_Layout.cshtml を使用して明示的に Detail.cshtml のレイアウトをオーバーライドすることです。

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

より一般的な解決策が必要な場合は、次のことを試してください。

カスタム DisplayMode を作成します。

public class MobileDisplayMode : IDisplayMode
{
    private bool _mobileViewWasUsed = false;

    public override DisplayInfo GetDisplayInfo(HttpContextBase httpContext, string virtualPath, Func<string, bool> virtualPathExists)
    {
        string filePath = this.TransformPath(virtualPath, this._suffix);
        if (filePath != null && virtualPathExists(filePath))
        {
            if (!_mobileViewWasUsed)
            {
                if (virtualPath.IndexOf("layout", StringComparison.InvariantCultureIgnoreCase) != -1)
                    return (DisplayInfo) null;

                _mobileViewWasUsed = true;
            }
            return new DisplayInfo(filePath, (IDisplayMode) this);
        }
        else
            return (DisplayInfo) null;
    }
}

global.asax に追加します。

DisplayModeProvider.Instance.Modes.Insert(0, new MobileDisplayMode("mobile"));

残念ながら、いくつかの承認されていない仮定 (リクエストごとの DisplayMode の作成など) に基づいているため、テストする機会はありません。とにかく、興味があり、テストする機会があれば、それは素晴らしいことです.

于 2013-11-14T18:42:35.313 に答える