ASP.NET MVCカスタムビューエンジンが呼び出されない
-
06-07-2019 - |
質問
ユーザーエージェントに基づいてモバイルビューを提供するカスタムビューエンジンを実装しようとしています。 このブログの投稿からスコット・ハンセルマンのアプローチに従っています。
私は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メソッドのオーバーライドが含まれておらず、当然、ネストされたクラスのメソッドは呼び出されません。
教訓:オンラインで見つかったコードを使用するときは、コピーして貼り付けないでください!常に自分で入力してください。
この質問を確認し、私を助けてくれたすべての人に感謝します。
今、恥と恥ずかしさの隅に立ちます!