質問

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

私はWebFormsViewEngineを継承し、スコットがブログで説明しているのと同じ方法で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;
    }

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

役に立ちましたか?

解決

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

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

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

この質問を確認し、私を助けてくれたすべての人に感謝します。

今、恥と恥ずかしさの隅に立ちます!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top