2

ユーザーエージェントに基づいてモバイルビューを提供するカスタムビューエンジンを実装しようとしています。私はこのブログ投稿からスコット・ハンゼルマンのアプローチに従っています。

私はWebFormsViewEngineから継承し、Scottがブログで説明しているのと同じ方法でFindViewメソッドをオーバーライドしました。

次に、Global.asax Application_Startメソッドに数行を追加して、ビューエンジンコレクションをクリアし、ビューエンジンの新しいインスタンスを追加しました。

いくつかのテストの後、MVCが私のビューエンジンを無視しているように見えます。ブラウザのユーザーエージェントに基づいてカスタムビューを見つけることができなかった場合、ビューに追加するカスタムパスをハードコーディングすることにしましたが、それでもデフォルトのビューにフォールバックすることができました。FindViewメソッドにブレークポイントを設定しましたが、確かに、まったく呼び出されていません。

カスタムビューエンジンを機能させるにはどうすればよいですか?どんな助けでも大歓迎です。

私のビューエンジンは次のようになります。

public class MyViewEngine: WebFormsViewEngine
{
    public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
         ViewEngineResult result = null;

         //Serve a special view for iPhones
         if (UserAgentIs(controllerContext, "iPhone"))
         {
              result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
         }

         //If no special view is found, fall back to the default view
         if (result == null || result.View == null)
         {
              result = base.FindView(controllerContext, viewName, masterName, useCache);
         }

         return result;
    }

    private bool UserAgentIs(ControllerContext controllerContext, string userAgentToTest)
    {
         return (controllerContext.HttpContext.Request.UserAgent.IndexOf(userAgentToTest, StringComparison.OrdinalIgnoreCase) > 0);
    }
}

そして私のGlobal.asaxで:

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new MyViewEngine());
}

この設定が機能しなかったとき、私はFindViewメソッドを次のように単純化しようとしました。

public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
         ViewEngineResult result = null;
         result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
         return result;
    }

そして、それもうまくいきませんでした。それでもデフォルトのビューが返されました。そして、はい、そのステートメントによって検出されるはずのビューページとマスターページは実際に存在します。なぜこれが機能しないのか、私はかなり困惑しています。

4

1 に答える 1

2

まあこれは確かに恥ずかしいです:

ビューエンジンを作成したとき、Scott Hanselmanのブログ投稿をフォローしていました(リンクについては、元の投稿を参照してください)。ビューエンジンクラスを削除し、Scottのコードをコピーしてクラスに貼り付け、必要に応じて変更することにしました。クラス定義を含む彼のコードを誤ってクラスにコピーして、ネストされたクラスを作成しました。したがって、私のビューエンジンには、実際にはFindViewメソッドのオーバーライドが含まれていなかったため、ネストされたクラスのオーバーライドが呼び出されることはありませんでした。

レッスン:オンラインで見つかったコードを使用する場合は、コピーして貼り付けないでください。常に自分で入力してください。

この質問をチェックして私を助けようとしたすべての人に感謝します。

恥ずかしさと困惑の片隅に立ちます!

于 2009-10-23T16:59:26.333 に答える