【问题标题】:How to call error function in $.ajax with c# MVC4?如何使用 c# MVC4 在 $.ajax 中调用错误函数?
【发布时间】:2015-01-30 12:47:38
【问题描述】:

我在 MVC4 中有一个 C# 项目。在这个项目中,我的一个控制器有一个由 Ajax 函数调用的方法:

[HttpPost]
public string EditPackage(int id, string newPkgName)
{
    try{
        //do logic here
        return "OK";
    }catch(Exception exc){
        return "An error occurred, please try later! " + exc.Message;
    }
}

此方法由以下 Ajax 函数调用,使用 jQuery:

$.ajax({
    url: $(this).data('url'),
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    traditional: true,
    data: JSON.stringify({ id: id, newPkgName: newPkgName}),
    success: function () {
        location.reload(true);
        successNotification("Package edited successfuly!");
    },
    error: function (message) {
        errorNotification(message);
    }
});

这段代码的问题在于,即使服务器在 catch 中返回了 return "An error occurred, please try later! " + exc.Message; 消息,成功函数总是被调用。

换句话说,无论我做什么,我都不会运行错误函数。

为了解决这个问题,我查看了官方文档:

但是,由于我对此并不熟悉,因此我无法理解任何参数,也无法有效地使用它们。

如何使用 Ajax、jQuery 和我的控制器创建包含所有可能信息的良好错误消息?

【问题讨论】:

  • 你可以试试扔而不是返回
  • 如果响应状态不是 OK(200) 则调用错误函数,但是如果您在服务器上捕获异常,则返回状态为 OK(200) 的响应,所以,简单不捕获异常

标签: javascript c# jquery ajax asp.net-mvc-4


【解决方案1】:

$.ajax 调用的error 部分仅在返回的状态代码不是200 OK 时触发。在您的情况下,您将返回一个纯文本响应,因此将是200。您可以像这样更改此行为:

try {
    // do logic here
    return "OK";
}
catch (Exception exc) {
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Bad Request");
}
error: function (jqXHR, textStatus, errorThrown) {
    errorNotification(textStatus);
}

您可以将HttpStatusCode 更改为适合您需要的任何内容。

或者,您可以保留 200 响应并返回带有标志的 JSON,以指示请求是否成功:

[HttpPost]
public ActionResult EditPackage(int id, string newPkgName)
{
    try {
        //do logic here
        return Json(new { Success = true, Message = "OK"});
    }
    catch (Exception exc) {
        return Json(new { Success = false, Message = "An error occurred, please try later! " + exc.Message });
    }
}

然后您可以删除error 处理程序,并检查您的success 处理程序中的标志状态:

success: function(response) {
    if (response.Success) {
        location.reload(true);
        successNotification("Package edited successfuly!");
    }
    else {
        errorNotification(response.Message); 
    }
},

【讨论】:

  • 如果我使用第一种方法,我需要对我的 Ajax 函数进行哪些更改?
  • 您无需对其进行任何更改。
  • 要正确显示信息,我的错误函数需要为error: function (jqXHR, textStatus, errorThrown )。如果您将此添加到您的回复中,我将很乐意接受:D
  • 你是对的 - 对不起,我完全忘记了。我已经更新了我的答案。
  • 我使用了这个return Json(new { Success = false, Message = "An error occurred, please try later! " + exc.Message });,但它仍然返回500, Internal Server Error,我该如何使用自定义消息?
【解决方案2】:

我执行以下操作,这可能不是最好的方法,但它适用于我尝试做的事情。

[HttpPost]
public ActionResult EditPackage(int id, string newPkgName)
{
    try{
        //do logic here
        return Json(new {Success = true, Message = "OK"});
    }catch(Exception exc){
        return Json(new {Success = false, Message =  "An error occurred, please try later! " + exc.Message});
    }
}

那么我的 Ajax 如下所示:

$.ajax({
    url: $(this).data('url'),
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    traditional: true,
    data: JSON.stringify({ id: id, newPkgName: newPkgName}),
    success: function (data) {
        if(data.Success)
        {
            location.reload(true);
            successNotification("Package edited successfuly!");
        }
        else
        {
            errorNotification(data.Message);
        }
    },
    error: function (message) {
        errorNotification(message);
    }
});

我这样做是为了让您从服务器捕获 http 错误的标准错误,但这意味着您可以以更有用的方式传递成功或失败。这也意味着如果您的更新由于验证原因或其他原因而失败,您可以很好地传递该消息。

【讨论】:

  • 仅供参考您创建匿名对象的语法不正确。
  • 原来如此,我会更正一下,很抱歉在打字的同时有人说。
猜你喜欢
  • 2012-12-23
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2012-06-04
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多