ASP.NET MVC 4 アプリケーションでエラーが発生した場合、エラーの種類に応じてユーザーのビューをカスタマイズしたいと考えています。たとえば、ページが見つからない、または例外が発生した (例外に関するユーザーフレンドリーな詳細を含む)。StackOverflow やその他のオンライン ソースでこれを行う方法の他の例を確認しましたが、どの回答もうまくいきません。
基本的な [HandleError] 属性は、VS2012 で .NET 4.5 をターゲットとする MVC 4 アプリケーションで機能していないようです。ホームコントローラーにあるコードは次のとおりです。
[HandleError]
public ActionResult Index()
{
Response.TrySkipIisCustomErrors = true; //doesn't work with or without this
throw new NullReferenceException("Uh oh, something broke.");
}
例外をスローしているだけで、[HandleError] 属性のためにデフォルトの ~/Shared/Error.cshtml ビューが返されることを期待していますが、ページを表示できないことを示す HTTP 500 Internal Server Error だけが表示されます。表示されます。web.config を確認したところ、さまざまな構成が奇妙な動作をしているようです。このセクションには、現在次のものが含まれています。
<customErrors mode="On" />
(defaultRedirect と customErrors mode="Off" を追加しようとしましたが、効果はありませんでした...共有のエラー ビューも CustomError ビューもレンダリングされていません。customErrors モードをオフに変更すると、すると、期待通りに例外の詳細を見ることができるので、「あ、何か壊れた」という例外をちゃんとスローしています。
また、OnException ハンドラーを HomeController に追加しようとしましたが、デバッグして OnException イベントが発生していることを確認できますが、違いはありません。
protected override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
filterContext.ExceptionHandled = true;
if (filterContext == null)
{
filterContext.Result = View("CustomError");
return;
}
Exception e = filterContext.Exception;
// TODO: Log the exception here
ViewData["Exception"] = e; // pass the exception to the view
filterContext.Result = View("CustomError");
}
ビューを指定するために [HandleError] を変更しようとしましたが、それも何もしていないようです:
[HandleError(View="CustomError")]
どんな助けでも大歓迎です。詳細が必要な場合はお知らせください。