2017-04-05 20 views
2

キャッチオールエラーの手段として、私はこれをMVC WebアプリケーションのBaseControllerに追加しました。MVC OnExceptionで例外が処理されるのはなぜですか?

public class BaseController : Controller 
{ 
    protected override void OnException(ExceptionContext filterContext) 
    { 
     _logger.Error(filterContext.Exception, "Website error page displayed."); 

     TempData["ErrorMessage"] = "Unspecified error - please contact support"; 
     filterContext.RouteData.Values["controller"] = "Error"; 
     filterContext.Result = new ViewResult 
     { 
      ViewName = "Error", 
     }; 

     filterContext.ExceptionHandled = true; 
    } 
} 

そして、私はこのようになり、専用のErrorControllerがあります。エラーはアプリケーションの一部で処理され、ユーザーがエラーページにリダイレクトされ、これが正常に動作すると

public class ErrorController : BaseController 
{ 
    [AllowAnonymous] 
    public ActionResult Error() 
    { 
     string errorMessage = "There has been an error"; 
     if(TempData["ErrorMessage"] != null) 
     { 
      errorMessage = TempData["ErrorMessage"].ToString(); 
     } 

     Logger.Warn("Error error page displayed with message {0}", errorMessage); 
     ViewBag.ErrorMessage = errorMessage; 
     return View("Error"); 
    } 
} 

if (!await UserManager.IsEmailConfirmedAsync(user.Id)) 
{ 
    TempData["ErrorMessage"] = "You must have a confirmed email to log on."; 
    return RedirectToAction("Error", "Error"); 
} 

エラーが未処理であるとBaseControllerOnExceptionを経由する場合は、エラー表示は期待通りにレンダリングしますが、トンのエラー・アクション彼は決してヒットしない。エラーメッセージにはデフォルト値が設定されており、アクション内のブレークポイントはトリップしません。

これはなぜですか? OnExceptionからコントローラーアクションを正しく呼び出すにはどうすればよいですか?

+0

[こちら](http://stackoverflow.com/questions/960280/asp-net-mvc-controller-onexception-not-being-called)を確認してください。 – Berkay

+0

@Berkayそれはまったく問題ではありません。 OnExceptionが確実に呼び出されています。しかし、エラーコントローラにリダイレクトするとき、エラーアクションは呼び出されていません。 –

+0

Resultプロパティを、名前で指定されたビューを返す 'ViewResult'のインスタンスに設定しています。 'ViewName =" Error "、'に別のビュー名を入れてチェックすることができます。 'viewnameが見つからないと言うべきです。'あなたが基本的に必要とするのは、コントローラの 'ErrorController'の' Error'アクションにリダイレクトすることです。 –

答えて

1

filterContext.Resultと表示されているので、タイプはActionResultです。これは、ViewResultとRedirectToRouteResultの両方と互換性のある戻り値の型です。

どのようにViewResult機能はそれだけです。指定されたビューを応答ストリームにレンダリングします。

RedirectToActionRedirectToRouteResultを返します。これはActionResultから派生しています。また、指定されたルートデータに基づいてルーティングエンジンによって決定されたURLにHTTPリダイレクトを実行します。

だからあなたの場合には、あなたはリダイレクトを必要とするので、それはあなたがそれがRedirectToRouteResultを返すと、指定したルートにリダイレクトするようRedirectToAction("Error", "Error");使用する必要が理由です。

関連する問題