如何使用 c# MVC4 在 $.ajax 中调用错误函数

How to call error function in $.ajax with c# MVC4?

本文关键字:调用 错误 函数 ajax 何使用 MVC4      更新时间:2023-09-26

我在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 中返回返回"An error occurred, please try later! " + exc.Message;消息,成功函数也是始终调用的函数。

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

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

  • http://api.jquery.com/jQuery.ajax/

但是,由于我是新手,因此我无法理解任何参数,也无法了解如何有效地使用它们。

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

当返回的状态代码不是200 OK时,才会触发$.ajax调用的error部分。在您的情况下,您返回的纯文本响应将因此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); 
    }
},

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

[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 错误的标准错误,但这意味着您可以以更有用的方式传递成功或失败。这也意味着,如果您的更新由于验证原因或其他原因而失败,您可以很好地将该消息传回。