2

クラス レベルで HandleError 属性を持つ C# MVC 3 コントローラーがあります。

[HandleError(View = "MyErrorPage")]   
public class MyController : Controller
{

メソッドレベルで私が持っている:

[HttpPost]
[MyExceptionHandler]
public ActionResult DoSomeStuff(FormCollection fc)
{

MyExceptionHandler は次のようになります。

public class MyExceptionHandlerAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        //do Stuff

        JsonResult result = new JsonResult {
            Data = new { 
                    error = "Your request blah blah...."
                }
            };
        filterContext.Result = result;
        filterContext.ExceptionHandled = true;
    }
}

これは、私のローカルホストでは問題なく動作します。つまり、メソッド 'DoSomeStuff' [MyExceptionHandler] で例外が呼び出された場合、クラス レベル [HandleError] は呼び出されません。ただし、開発環境では、クラス レベルの [HandleError] が機能します。その結果、HandleError view=MyErrorPage がレンダリングされます。

  1. [HandleError] が localhost で冗長であることは承知していますが、修正 (または構成オプション) は可能ですか?
  2. 開発環境 (localhost ではない) で MyExceptionHandler がまったく呼び出されているかどうかはわかりません。クラスレベルの前に呼び出される可能性があります [HandleError]?

私の問題は、[MyExceptionHandler] を呼び出す唯一のハンドラーにする必要があることです。ローカルホストで [HandleError] を呼び出せるようにして、ローカルで問題をシミュレートできるようにしたいと考えています。

4

1 に答える 1

0

私は解決策を見つけました:

[HandleError(View = "MyErrorPage", Order = 2)]

問題を解決しました(具体的にはOrder = 2)。

その理由は、このハンドラーの優先度がメソッドレベルのハンドラーよりも低くなっているためです。したがって、メソッドレベルのハンドラーが最初に実行されます。上記のコードのように、例外に処理済みのフラグが立てられるため、コントローラーレベルのハンドラーは実行されません。

問題がローカルホストでのみ発生する理由は、[HandleError]がデフォルトでローカルホストで有効になっていないためです。ただし、開発環境では自動的に有効になりました。

次に、次のように設定することで、ローカルホストで問題を確認できると思います。

<system.web>
   <customErrors mode="On" />

しかし、何らかの理由で、それはうまくいきませんでした....とにかく、別の問題だと思います。

参考までに、私はこのエラー処理のすべてを(AJAXに焦点を当てて)ここに要約しようとしました:http://outbottle.com/net-mvc-3-custom-ajax-error-handling-2/

ありがとう

于 2012-06-28T18:02:05.937 に答える