私の 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;
}
}
}