web-dev-qa-db-ja.com

ASP.NETMVCアクションからエラーを返す方法

Webサイトの開発にASP.NETMVCを使用しています。 AJAX機能にjqueryを使用しています。アクションメソッドで、入力が正しくないか、アクションを実行できなかったことを示すエラーを返したいです。このようなエラーの場合、 jquery ajaxエラーハンドラーが呼び出され、そこで適切なアクションを実行できることを期待しています。これを行う方法が見つかりません。以下は私のアクションメソッドです。

エラーの場合、jqueryエラーハンドラーをトリガーするためにアクションから何を送信する必要がありますか?

public ActionResult AddToFavourites(int entityId, string entityType)
    {

        if (!Request.IsAjaxRequest())
            throw new InvalidOperationException("This action can be called only in async style.");

        try
        {
            RBParams.EntityType typeOfFavourite = (RBParams.EntityType)Enum.Parse(typeof(RBParams.EntityType), entityType);
            string status = "";

            if (typeOfFavourite == RBParams.EntityType.BusinessEntity)
            {
                status = MarkFavouriteEntity(entityId);
            }
            else if (typeOfFavourite == RBParams.EntityType.Review)
            {
                status = MarkFavouriteReview(entityId);
            }
            else
            {
                throw new InvalidOperationException("The type of the entity is not proper");
            }

            return Content(status);

        }
        catch (Exception ex)
        {

            return Content("Error");
        }
    }
16

アクションが期待されるステータスコードを返さない場合、ajaxエラーハンドラーが呼び出されます。たとえば、アクションが見つからなかった場合や、処理しない例外をスローした場合に発生します。あなたの場合、アクションでエラーをキャッチしなかった場合に呼び出されます(アクションは500ステータスコードを返すため)。

ただし、これはおそらく予想されるエラーであるため、この方法では行いません。成功したときとエラーが発生したときの両方でjsonを返したいと思います。次に、それが成功した呼び出しであるかどうかを示すことができます。このようなもの:

public ActionResult AddToFavourites(int entityId, string entityType)
{

    if (!Request.IsAjaxRequest())
        throw new InvalidOperationException("This action can be called only in async style.");

    try
    {
        RBParams.EntityType typeOfFavourite = (RBParams.EntityType)Enum.Parse(typeof(RBParams.EntityType), entityType);
        string status = "";

        if (typeOfFavourite == RBParams.EntityType.BusinessEntity)
        {
            status = MarkFavouriteEntity(entityId);
        }
        else if (typeOfFavourite == RBParams.EntityType.Review)
        {
            status = MarkFavouriteReview(entityId);
        }
        else
        {
            throw new InvalidOperationException("The type of the entity is not proper");
        }

        return Json(new { Success = true, Status = status });

    }
    catch (Exception ex)
    {

        return Json(new { Success = false, Message = ex.Message });
    }
}

次に、成功した呼び出しと同じ方法でそれを処理します。 json応答のSuccessプロパティを確認するだけです。次に、エラーコールバックで予期しないエラーを処理します。

23

マティアス・ヤコブソンの答えは正しいです。しかし、エラーをjQueryに返す最善の方法は、JSONを作成し、ステータス500で送信することだと思います。しかし、それを実行して、IIS 7 Iメッセージの代わりにカスタムページが返されていることがわかりました。

コードは...

catch (Exception ex)
{
    Response.StatusCode = 500;
    return Json(new { error = ex.Message });
}

しかし、それから私はこれを見た このスレッド これに私を導いた ウェブサイト (リック・ストラールから)。

全体として、カスタムエラーページを挿入しないようにIISと言う必要があることを理解したので、このフラグが必要です(global.asaxまたはcatchに):

Response.TrySkipIisCustomErrors = true;

したがって、jQueryではコードは同じままです。

$.ajax({...})
.done(function (result) {...})
.fail(function (e) { 
   console.log(e.responseJSON.error);
});
12

エラーを処理するためにconfigjqueryを使用する必要があります。

$.ajaxSetup({
    error: function(xhr) {
        alert(xhr.statusText);
    }
})
0
ldp615