为什么我的异常没有被jquery ajax调用到控制器?

时间:2014-05-22 13:48:56

标签: javascript jquery ajax asp.net-mvc

我正在处理一个在我的asp.net mvc控制器中调用动作的按钮。我试图捕捉错误并以合适的方式向用户显示错误,但我似乎无法弄清楚如何正确地做到这一点。每当我在我的控制器中强制执行异常(用于测试目的)时,我的ajax调用的.sucess部分仍然会被解雇。这是我的ajax电话:

$(document).ready(function() {
    $("#del").on("click", function() {
        var message;
        $.ajax({
            url: "@Url.Action("DeleteImage", "UnitSummary")",
            type: "GET",
            dataType: "json",
            data: { unitId: "@Model.UnitId" },
            error: function(msg) {
                message = msg;
                $('#delsection').hide().html('<div class="alert alert-danger"><strong>Ouch!</strong> ' + message.statusText + '</div>').fadeIn('slow');
            },
            success: function(msg) {
                message = msg;
                $('#delsection').hide().html('<div class="alert alert-success"><strong>Success!</strong> Image was deleted.</div>').fadeIn('slow');
            }
        });
    });

这是我的控制者:

[HttpGet]
public ActionResult DeleteImage(int unitId)
{
    try
    {
        throw new Exception("Forced error");
        UnitClient.UpdateUnitImage(unitId, new byte[0]);
    }
    catch (Exception e)
    {
        Log.Error(e);
        return Json(new { e.Message }, JsonRequestBehavior.AllowGet);
    }

    return Json(new JsonResult(), JsonRequestBehavior.AllowGet);
}

即使未删除图像,也始终会调用成功。我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

  

每当我在控制器中强制执行异常(用于测试目的)时   我的ajax电话的.sucess部分我仍然被解雇了。

以下代码行不是jQuery的ajax解释为来自服务器的错误响应(因此没有调用error回调), 但是 常规200 OK回复:

return Json(new { e.Message }, JsonRequestBehavior.AllowGet);

请改为:

return new HttpStatusCodeResult(HttpStatusCode.BadRequest, e.Message);

这是HTTP状态代码发挥作用的地方,BadRequest是HTTP错误状态代码。

以下是BadRequest的更多信息:

  

等效于HTTP状态400. BadRequest表示该请求   服务器无法理解。没有时发送BadRequest   其他错误适用,或者确切错误未知或确实存在   没有自己的错误代码。