2012-03-31 11 views
0

カスタム例外を作成しました。私のアプリケーションが「例外的な状態」にあるとみなすたびに、このクラスのインスタンスを投げています。この例外は、アプリケーションロジッククラス(私の場合はサービス)でスローされています。 これで、デフォルトのASP MVC例外リダイレクトも実行されていますが、これらのカスタム例外の場合、「エラー」ページにリダイレクトするのではなく、divにメッセージを表示することができます私のLayout.cshtmlページ)。私はTempData ["ApplicationError"]に例外メッセージを追加することを考えていました。 このコードはコントローラのアクションメソッド全体ではなく、一度だけ記述します。だから、私のベースのコントローラクラスで私は保護された無効onExceptionを(ExceptionContext filterContext)を上書きし、私のコードは次のようになります。ASP MVCに表示されるカスタム例外メッセージ

protected override void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception is InvalidOperationException) 
      TempData["ApplicationError"] = filterContext.Exception.Message; 
     else 
      base.OnException(filterContext); 
    } 

私の問題は、この例外がスローされたとき、私はまだデフォルトのエラーページにリダイレクトしてしまうことがあります。私はこれが起こらないようにします。私が欲しいのは、ユーザーがいる同じビューのフレンドリーなdivにカスタム例外のメッセージを表示することです。どのように私はこれを達成することができますか?

答えて

0

私は同様の状況で何をしましたか、エラーメッセージと成功メッセージのためにViewModelにプロパティを追加しました(他のすべてのビューモデルが継承しているベースクラスに追加されました)。エラーが発生すると(アプリケーション/システムのいずれか)、私はこのプロパティに値を設定し、これを私のビューに表示します。私は常にコントローラからviewmodelを返すので、エラーページは表示されません。

public class BaseViewModel 
{ 
    public string ErrorMessage { set;get;} 
    public string SuccessMessage {set;get;} 
    public bool IsValid { set;get;} 
} 

public class UserViewModel: BaseViewModel 
{ 
    // user properties 
} 

そして、私のコントローラであなたがExceptionHandledプロパティを設定して、例外を処理していることを示す

public ActionResult Get(int id) 
{ 

    UserViewModel ovjUser; 
    try 
    { 
    objUser=MyService.GetUser(id); 
    if(!objUser.IsValid) 
    { 
     objUser.ErrorMessage="This User Account is not Valid"; 
    } 
    } 
    catch(Exception ex) 
    { 
    // log error 
    objUser.ErrorMessage="Application is buzy now!.Pls try later"; 
    } 
    return View(objUser); 
} 
+0

ありがとうございました。このアプローチの私の問題は、この例外をスローするすべてのメソッドでtry-cacth-AddErrorをコピー/ペーストする必要があることです。私はこれを望んでいない。私はいつもこれを処理するための中央(インフラストラクチャー)のようなものが必要です。ほとんどの場合、ビュー関連のデータをバックアップするビューモデルはありません。 –

+0

強く型付けされたビューを提供するので、ViewModelを持つ方が良いアイデアです。 – Shyju

+0

今はVMを必要としません。特に自分の問題に取り組んでいるような場合は特にそうです。 –

0

試してみてください。

protected override void OnException(ExceptionContext filterContext) 
{ 
    if (filterContext.Exception is InvalidOperationException) 
    { 
     filterContext.ExceptionHandled = true; 
     var viewResult = new ViewResult(); 
     viewResult.ViewData["ApplicationError"] = filterContext.Exception.Message; 
     filterContext.Result = viewResult; 
    } 
} 

重要な側面は、内部例外が発生したため、ということですコントローラーのアクションでは、アクション結果が返されるまでは到達しませんでした。したがって、アクションがビューをレンダリングするか、JSONを返すか、リダイレクトするかどうかは、もはや分かりません。したがって、filterContext.Resultプロパティを設定してビューをレンダリングすると仮定できます。明らかに、このビューに関連付けられたビューモデルがあれば、それを再構築することはできません。したがって、あなたのビューが整形されていることを確認してください。ViewData["ApplicationError"]の中に何かがあると、あなたのビューモデルでは何もしようとしません。=>実行中にアプリケーションがクラッシュしたことを覚えています。アクション。

+0

ありがとう、私は例外処理スコープでブレークポイントを設定し、そこに取得しますが、私はまだ例外と黄色の画面が表示されます...私はそれをローカルに実行する場合、私はまだ表示する必要がありますか分からない(localhost/...)? –