Ajax调用总是返回成功

我对我的控制器进行了ajax调用,然后调用一个返回true或false的服务。 我似乎无法弄清楚为什么当它从控制器返回到视图时总会触发我的成功函数。

调节器

[HttpGet] public JsonResult TagUnit(int id, string selectedItem) { try { var result = UnitClient.TagUnit(id, selectedItem); if (!result) { throw new InvalidOperationException(); } return Json(new {success = true}, JsonRequestBehavior.AllowGet); } catch (Exception e) { return Json(new {success = false}, JsonRequestBehavior.AllowGet); } } 

Cshtml – Javascript – Ajax

  .on("select2-selecting", function (e) { var url = '@Url.Content("~/UnitDetails/TagUnit/" + Model.ViewUnitContract.Id)'; var id = e.val; var tagName = e.object.text; console.log(id + " : " + tagName); $.ajax({ url: url, data: { selectedItem: tagName }, type: 'GET', dataType: 'json', success: function () { alert('Success'); }, error: function () { alert('Error'); } }); }).select2('val', ['1', '2']); 

我在这里想念的是什么?

您应该在success方法中validation服务器结果数据。

  $.ajax({ url: url, data: { selectedItem: tagName }, type: 'GET', dataType: 'json', success: function (data) { if (data != null && data.success) { alert('Success'); } else { alert('Error'); } }, error: function () { alert('Error'); } }); 

错误方法调用如果在服务器上发生500错误或服务器不可用等。

我认为如果你抛出一个exception,它仍将返回成功状态代码。 所以我所做的是创建一个可以附加到MVC方法的ajax调用error handling程序属性。 它将捕获未捕获的exception,设置错误状态代码并提供一般错误消息(并且还记录到Elmah)。 该属性如下

 public class HandleJsonErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { var serviceException = filterContext.Exception as Exception; filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; filterContext.Result = new JsonResult { Data = new { errorMessage = "Generic error message", errorType = 0 }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; var kayttaja = (Kayttaja.TKayttajantiedot)filterContext.HttpContext.Session["userKayttajanTiedot"]; Global.HandleApplicationError(serviceException, kayttaja); filterContext.ExceptionHandled = true; // Log to elmah //Elmah.ErrorSignal.FromCurrentContext().Raise(filterContext.Exception); } } 

然后装饰你的动作方法只能由Ajax调用: [Campus.Attribuutit.HandleJsonError]

在ajax调用对象中触发error handling程序的重要行是HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError

不知道我是否理解你的问题。

如果请求成功,将执行Ajax中的success函数。 如果请求失败,将执行错误function。 您必须检查服务器在success函数内返回的内容。

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