5

次のようなコントローラーにメソッドがあります。

[HttpPost]
public void UnfavoriteEvent(int id)
{
    try
    {
        var rows = _connection.Execute("DELETE UserEvent WHERE UserID = (SELECT up.UserID FROM UserProfile up WHERE up.UserName = @UserName) AND EventID = @EventID",
            new { EventID = id, UserName = User.Identity.Name });
        if (rows != 1)
        {
            Response.StatusCode = 500;
            Response.Status = "There was an unknown error updating the database.";
            //throw new HttpException(500, "There was an unknown error updating the database.");
        }
    }
    catch (Exception ex)
    {
        Response.StatusCode = 500;
        Response.Status = ex.Message;
        //throw new HttpException(500, ex.Message);
    }
}

ご覧のとおり、このエラーを元に戻すためにいくつかの異なる方法を試しました。JavaScript には、このメソッドを呼び出す次のブロックがあります。

var jqXHR;
if (isFavorite) {
    jqXHR = $.ajax({
        type: 'POST',
        url: '/Account/UnfavoriteEvent',
        data: { id: $("#EventID").val() }
    });
}
else {
    jqXHR = $.ajax({
        type: 'POST',
        url: '/Account/FavoriteEvent',
        data: { id: $("#EventID").val() }
    });
}

jqXHR.error = function (data) {
    $("#ajaxErrorMessage").val(data);
    $("#ajaxError").toggle(2000);
};

今、私がやりたいことは、発生したエラーをjqXHR.error関数にスローして、適切に処理できるようにすることです。

現在、コメントを外したコードは、配置しているテキストStatusが許可されていないという例外をスローし、コメントを付けたコードは、実際には応答として標準エラー ページを返します (驚くべきことではありません)。

それで、私はいくつかの質問があります:

  1. エラーを適切にスローするにはどうすればよいですか?
  2. プロパティは何をしResponse.Statusますか?

皆さんありがとう!

4

2 に答える 2

3

次のようにして、JavaScript側から応答ステータスを取得できるようになります。

$.ajax({
    type: 'POST',
    url: '/Account/UnfavoriteEvent',
    data: { id: $("#EventID").val() },
    success: function(data, textStatus, jqXHR) {
        // jqXHR.status contains the Response.Status set on the server
    },
    error: function(jqXHR, textStatus, errorThrown) {
        // jqXHR.status contains the Response.Status set on the server
    }});

ご覧のとおり、関数を関数に渡す必要がありerrorますajax...この例では、関数をのerrorプロパティに設定しているため、jqXHR効果はまったくありません。

ajaxイベントに関するドキュメント

jQueryのドキュメントによると、エラー文字列はerrorThrownパラメータに含まれます。

応答を使用しないでください

代わりに、次を返す必要がありますHttpStatusCodeResult

[HttpPost]
public void UnfavoriteEvent(int id)
{
    try
    {
        var rows = _connection.Execute("DELETE UserEvent WHERE UserID = (SELECT up.UserID FROM UserProfile up WHERE up.UserName = @UserName) AND EventID = @EventID",
            new { EventID = id, UserName = User.Identity.Name });
        if (rows != 1)
        {
            return new HttpStatusCodeResult(500, "There was an unknown error updating the database.");
        }
    }
    catch (Exception ex)
    {
        return new HttpStatusCodeResult(500, ex.Message);
    }
}
于 2012-10-19T02:21:07.807 に答える
1

を使用しResponse.StatusDescriptionます。jQuery 側では、 を使用しますjqXHR.fail(function(){})

于 2012-10-19T03:55:02.760 に答える