アクション結果の外部で発生するすべての実行を処理する次のコードがあります (HandleErrorAttribute が到達できない場所)。
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = (HttpException)exception;
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException == null)
{
routeData.Values.Add("action", "Home");
}
else //It's an Http Exception, Let's handle it.
{
routeData.Values.Add("action", "Handle");
}
// Pass exception details to the target error View.
routeData.Values.Add("error", httpException);
// Clear the error on server.
Server.ClearError();
// Avoid IIS7 getting in the middle
Response.TrySkipIisCustomErrors = true;
// Call target Controller and pass the routeData.
IController errorController = new SPP.Areas.UI.Controllers.ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
これはうまく機能します。設定したのと同じように、「エラー」コントローラーで「ハンドル」アクションを実行します。問題ない。
アクション内では別の例外がスローされ、それが私の HandleErrorAttribute フィルターによって取得されます。デバッグした後、次のパスを探していることがはっきりとわかります。
- 〜/Views/Error/Handle.aspx
- 〜/Views/Error/Handle.ascx
- ~/Views/Shared/Handle.aspx
- 〜/Views/Shared/Handle.ascx
- 〜/Views/Error/Handle.cshtm
- 〜/Views/Error/Handle.vbhtml
- ~/Views/Shared/Handle.cshtml
- 〜/Views/Shared/Handle.vbhtml
Areasとともに Razors ビュー エンジンを使用しています。これを行う理由。そのため、アプリケーションをきれいに保つことができます。私の問題は、このファイルがその中に収まるように、アプリケーション内にディレクトリを作成することを余儀なくされているように見えることです...私はこれのファンではありません。
むしろ、次の場所に移動することをお勧めします。
- ~/Areas/UI/Views/Error/Handle.cshtml
または何かのような...
- 〜/エリア/共有/ビュー/エラー/Handle.cshtml
これで、アプリケーションのルートにそのディレクトリを作成することで、これを解決できます。
私がこれを行っていない理由は、私が陥り始めて簡単な方法を使用し始めた場合です。私のアプリケーションはすぐに非常に面倒になります。自分のファイルやフォルダーの場所を定義するのが好きです。
誰かがダイレクト パスを設定する方法を知っている場合、または IController (エラー コントローラー) にそれがインスタンス化されたエリアを調べるように指示する場合、私はあなたを永遠に愛します。
どんな助けでも大歓迎です。
スティーブ