2

私の ASP.NET MVC 4 プロジェクトでは、カスタム ビュー エンジンを実装して、"Index.cshtml" ビュー ファイルがフォルダー内に存在する場合にそれを見つけようとしています。さらに、見つからないすべてのビュー パスに対して 404 をスローしています。

404 は、ビュー ファイルが存在しない場合に機能します。ビュー ファイルが存在する場合、ビュー エンジンは FileExists() 関数を使用して .Mobile.cshtml ファイルを探します。.mobile.cshtml ファイルがないため、例外がスローされます。非モバイル ファイルが既に見つかっているのに、ビュー エンジンが .mobile.cshtml ファイルを検索するのはなぜですか?

たとえば、ビュー エンジンが "~/Views/About/History/Index.cshtml" でビュー パスを見つけることができる場合、ファイル "~/Views/About/History/Index.Mobile.cshtml" を見つけようとします。 "。以下は、カスタム ビュー エンジンの完全なコードです。

namespace System.Web.Mvc
{
  // Extend where RazorViewEngine looks for view files.
  // This looks for path/index.ext file if no path.ext file is found
  // Ex:  looks for "about/history/index.chstml" if "about/history.cshtml" is not found.
  public class CustomViewEngine : RazorViewEngine
  {
    public BeckmanViewEngine()
    {
      AreaViewLocationFormats = new[] 
      {
        "~/Areas/{2}/Views/{1}/{0}/Index.cshtml",
      };

      ViewLocationFormats = new[] 
      {
        "~/Views/{1}/{0}/Index.cshtml",
      };
    }

    // Return 404 Exception if viewpath file in existing path is not found
    protected override bool FileExists(ControllerContext context, string path)
    {
      if (!base.FileExists(context, path))
      {
        throw new HttpException(404, "HTTP/1.1 404 Not Found");
      }

      return true;
    }
  }
}
4

2 に答える 2

2

Mobile を削除しようとしましたかDisplayModeProvider。で次のコマンドを実行すると、これを実現できますApplication_Start

var mobileDisplayMode = DisplayModeProvider.Instance.Modes.FirstOrDefault(a => a.DisplayModeId == "Mobile");

if (mobileDisplayMode != null)
{
    DisplayModeProvider.Instance.Modes.Remove(mobileDisplayMode);
}

FindView メソッドがクエリを実行するため、発生している問題は予想される動作ですDisplayModeProvider

于 2013-06-08T12:52:42.270 に答える