2

デバッグ中です。ASP.net MVC 4 Web アプリケーションで。

アプリケーションには多数の JsonResult コントローラ アクションがあります。エラーが発生した場合、システムはエラーのテキストと HTML マークアップを含むスタック トレースを返します。これは、ViewResult コントローラー アクションでエラーが発生した場合に便利ですが、JsonResult コントローラー アクションのエラー メッセージを読むのが難しくなります。通常、エラー メッセージのテキストはデバッガーで表示される場合があるためです。

JsonResult コントローラ アクションがエラー メッセージをプレーン テキストでブラウザに返すようにする実用的な方法はありますか?

4

2 に答える 2

0

これを処理する方法はいくつかありますが、最も簡単に機能するのは、例外をキャッチして、アクションのコンテキスト内で処理することだと思います。

public ActionResult Index()
{
    try
    {
        // Your code which may throw an exception.
    }
    catch(Exception ex)
    {
        return ex.ToJsonResult();
    }
}

任意の方法で例外変換を実行する拡張メソッドを簡単に作成できます。

internal static ExceptionHelper
{
    public static JsonResult ToJsonResult(this Exception ex)
    {
        // TODO: build and return the JsonResult from the exception informtation.
    }
}

これをグローバルな方法で処理するのは良いことですが、リフレクションを介して到達できる何らかの方法で署名を変更せずに、アクションの結果がどうなるはずだったかを知る簡単な方法はありません.

于 2012-12-13T17:27:35.310 に答える
0

やや複雑な解決策は、カスタムHandleErrorsAttribute実装を作成して、個々のアクション、コントローラー全体に追加するか、グローバル フィルターのコレクションに登録して、すべての要求をこの方法で処理することです。これは、例外のカスタム処理のための MVC の拡張ポイントです。

実装は、次のような非常に単純なものになる可能性があります。

public class HandleErrorsAsJsonAttribute : HandleErrorsAttribute
{
    public HandleErrorsAsJsonAttribute()
    {
    }

    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled)
        {
            return;
        }

        var ex = filterContext.Exception

        // TODO: build the JsonResult from the exception information.
        filterContext.Result = new JsonResult();

        // Indicate the exception is handled 
        // to prevent it being passed to other filters.
        filterContext.ExceptionHandled = true;
    }
}

この場合、JSON オブジェクトとして情報を返したいアクションまたはコントローラーにのみ適用できます。すべてのコントローラーが JSON を返す場合は、その属性をグローバル コレクションに追加するだけで完了です。

于 2012-12-17T10:15:43.437 に答える