2011-01-24 7 views
2

jsonpを返す一連のアクションを持つコントローラがあります。私の問題は、カスタムエラーを有効にすると、ハードサーバーエラーが発生した場合、jquery ajax呼び出しは「エラー」しないということです。だから、私はコントローラのためだけに、または必要ならば、そのコントローラの各アクションに対してカスタムエラーリダイレクトを無効にする必要があります。ASP.NET MVC 2.0 - コントローラ/アクションのカスタムエラーリダイレクトを無効にする

これらのアクションでのみエラーが発生した場合でもリダイレクトを無効にできますが、エラーコードをクライアントに返して、Ajaxでエラーを処理できるようにする方法はありますか?

編集:

いくつかのコードで拡張します。まず、カスタムエラーの設定を使用しています。

<customErrors mode="RemoteOnly" defaultRedirect="~/Error/ServerError"> 
    <error statusCode="403" redirect="~/Error/AccessDenied" /> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
    <error statusCode="500" redirect="~/Error/ServerError" /> 
    <error statusCode="999" redirect="~/Error/ServerError" /> 
</customErrors> 

次に、独自の例外レポート属性があります。この属性は、IControllerを実装するベースコントローラクラスに適用されます。私のコントローラはすべてこのベースコントローラを継承しているので、サーバエラーが発生したときにいつでもエラー報告が作成されます。

public sealed class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     base.OnException(context); 
     RaiseErrorSignal(context.Exception); 
    } 

    private static void RaiseErrorSignal(Exception ex) 
    { 
     IExceptionHandler handler = Resolve(); 

     handler.HandleError(ex.GetBaseException()); 
    } 

    private static IExceptionHandler Resolve() 
    { 
     return ServiceLocator.Locate<IExceptionHandler>(); 

    } 
} 

そして、私はこれだけのコントローラでは、この

public JsonpResult DoSomething(string sessionId /*...more params...*/) 
{ 
    //Do work 

    return new JsonpResult() { Data = new { } }; 
} 

のような方法でコントローラを持って/これらのアクションは、私は、エラーコードがクライアントに返されるようにリダイレクトを無効にしたいです。エラーは依然として発生する必要がありますが、何らかの理由でカスタムエラーモードをオフに変更する必要があります。これらは、AJAX呼び出しがある場合

+0

あなたは[HandleErrorAttributeを使用しています](http://msdn.microsoft.com/en-us/library/system.web.mvc.handlerorattribute.aspx)をコントローラー/ベースコントローラー上にインストールするか、単に標準のASP.NET ''あなたの設定の要素ですか? –

+0

これは標準カスタムエラーです。私は自分の例外ハンドラを書いてサーバのエラーをメールしてから、アプリケーションが組み込みのリダイレクトを実行できるようにし続けます。リクエストごとにカスタムエラーをプログラマチックに無効にしてコントローラにアタッチする属性を書き込む方法があることを期待していました。 – Josh

+0

特定のコントローラ/アクションまたは特定のアクションタイプ(ajaxメソッド)に対して無効にしますか? – frennky

答えて

1

、あなたはこのような何かを試みることができる:

public sealed class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      base.OnException(context); 
      RaiseErrorSignal(context.Exception); 
     } 
     else 
     { 
      //Respond to ajax call with error message 
     } 
    } 
    //... 
} 
+0

問題は私がエラーメッセージを返す必要があることですが、MVCはステータスコードを使用してこのポイントの後で自動的にリダイレクトを実行します。 – Josh

+0

これは試しましたか?私はリダイレクトがbase.OnException(コンテキスト)メソッドで行われたと思いましたか? – frennky

3

を私は答え@frennkyによって提供され、それに少し拡大しました。私は、HTTPレスポンスコードを設定して、jQuery側のエラーハンドラに処理させるようにしています。

私のケースでは、すべてのエラーをトラップしたASP.NETカスタムエラーページを使用する従来のwebformsアプリケーションと統合しています。すべての例外が飲み込まれ、jQueryのAJAX呼び出しが正常に完了したように見えました。カスタムエラーページのHTMLがjQuery AJAX success関数に返されました。 jQueryが提供するエラー処理を利用する方法が必要でした。このアプローチは、その目標を達成します。ここで

は私のカスタムHandleErrorAttributeである:ここでは

public class HandleAjaxErrorAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      base.OnException(filterContext); 
      return; 
     } 
     else 
     { 
      //Log the error here. 
      filterContext.ExceptionHandled = true; 
      filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest; 
      filterContext.HttpContext.Response.StatusDescription = filterContext.Exception.Message; 
     } 
    } 
} 

は(この例では単純化)jQueryのAJAXリクエストが失敗したときに呼び出される私のJavascriptの機能である:

function HandleAjaxError(jqXHR, textStatus, errorThrown) { 
    alert(jqXHR.statusText); 
} 
+0

'StatusDescription'はUnicodeテキストでうまく動作していないようです(少なくともChromiumブラウザでは)...これらのブラウザはナットを運転しています... :( – NoOne

関連する問題