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

我在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; } } 

使用jQuery,以下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 () { location.reload(true); successNotification("Package edited successfuly!"); }, error: function (message) { errorNotification(message); } }); 

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

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

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

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