0

検出されたときにビュー名にモバイル拡張機能を追加中です。

現在のコードは次のとおりです。

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
        string GroupName = System.Configuration.ConfigurationManager.AppSettings["GROUP"];

        return base.FindView(controllerContext, viewName + "_" + GroupName, masterName, useCache);
}

したがって、ルートが に進みSomeController、アプリの設定でグループが「TeamA」であると表示されている場合 (たとえば)、レンダリングされるビューは になりますIndex_TeamA.cshtml

ただし、存在しない場合は、Index_TeamA.cshtml期待どおりにデフォルトで Index.cshtml になります。

(これは、一部のチームによって要求された一部のビューに非常にわずかな違いがあるためです。)

ただし、モバイルバージョン用にこれに別のレベルを追加したいと思います。

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
        string GroupName = System.Configuration.ConfigurationManager.AppSettings["GROUP"];

        if (HttpContext.Current.Request.Browser.IsMobileDevice)
             GroupName += "_MOB";

        return base.FindView(controllerContext, viewName + "_" + GroupName, masterName, useCache);
}

ただし、問題は、Index_TeamA_MOB.cshtmlが見つからない場合Index.cshtml、実際にデフォルトにしたいのに、デフォルトで になることですIndex_TeamA.cshtml

なぜこれが起こるのかは明らかです。問題は、この実装をどのようにカスケードできるかということです。したがって、最初にグループ バージョンのモバイル バージョンをチェックし (モバイル ブラウザーが検出された場合)、それがない場合はグループ バージョンにフォールバックし、ない場合はデフォルト ビューを取得しますか?

更新、ここにバージョン 1 があります

編集:これは明らかに無限ループを引き起こします。

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            string GroupName = System.Configuration.ConfigurationManager.AppSettings["GROUP"];

            if (HttpContext.Current.Request.Browser.IsMobileDevice)
            {
                var result = ViewEngines.Engines.FindView(controllerContext, viewName + "_" + GroupName + "_MOB", masterName);

                if (result != null)
                    return base.FindView(controllerContext, viewName + "_" + GroupName + "_MOB", masterName, useCache);
            }

            return base.FindView(controllerContext, viewName + "_" + GroupName, masterName, useCache);
        }
4

1 に答える 1

0

あはは!最良の答えは、MVC 3 用に提供された新しい MVC 4 メソッドを実装することのようです。私が見つけたこのブログ投稿をチェックしてください: http://dotnet.learningtree.com/2011/10/31/preparing-for-asp-net- mvc-4-モバイル開発/

これは、機能するだけでなく、手間をかけずにアップグレードできるため、優れたソリューションです。

于 2012-04-27T17:55:50.390 に答える