ユーザーエージェントに基づいてモバイルビューを提供するカスタムビューエンジンを実装しようとしています。私はこのブログ投稿からスコット・ハンゼルマンのアプローチに従っています。
私は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;
}
そして、それもうまくいきませんでした。それでもデフォルトのビューが返されました。そして、はい、そのステートメントによって検出されるはずのビューページとマスターページは実際に存在します。なぜこれが機能しないのか、私はかなり困惑しています。