【问题标题】:ASP MVC and JsonResult in case of error出现错误时的 ASP MVC 和 JsonResult
【发布时间】:2015-11-06 10:43:23
【问题描述】:

在 ASP MVC 中,我有一个返回 json 数据的控制器:

public JsonResult Edit(int? id)
{
   if(id==null)
   {
      Response.StatusCode = (int)HttpStatusCode.BadRequest;
      return Json(new { message = "Bad Request" }, JsonRequestBehavior.AllowGet);
   }

   car carTmp = db.car.Find(id);
   if (carTmp == null)
   {
      Response.StatusCode = (int)HttpStatusCode.NotFound;
      return Json(new { message = "Not Found" }, JsonRequestBehavior.AllowGet);
   }

   return Json(carTmp, JsonRequestBehavior.AllowGet);
}

我也有以下ajax请求:

$.getJSON("Edit/" + data, function (result) {
            var car = result;
        })
        .error(function (error) {
            alert(error.message);
        })

为什么,在成功的情况下,在结果对象中我有 json 对象(即:我可以访问 result.id、result.name ecc...)但在错误的情况下,error.message 是未定义的? (我已经将消息放入error.responseJson.message)

【问题讨论】:

  • 因为结果即将到来,我的意思是在 null 的情况下,您将返回一条错误消息,但在成功的情况下也是如此。您可以通过向模型发送 null 来验证它一次

标签: c# asp.net .net ajax asp.net-mvc


【解决方案1】:

您将响应中的状态码设置为 404,因此应该执行错误回调。

问题在于error callback 被定义为function( jqXHR, textStatus, errorThrown ),其中jqxhr 将具有responseJSON 属性。

您只需将代码更改为:

$.getJSON("Edit/" + data, function (result) {
    var car = result;
})
.error(function (xhr) {
    alert(xhr.responseJSON.message);
})

【讨论】:

    【解决方案2】:

    问题是您设置的 StatusCode 将由浏览器解释,但您通过 Ajax 请求调用服务器,这将由较低层中的 javascript XMLHttpRequest 对象解释,它具有您指出的不同行为。

    如果您想要一种获取结果的同质方式,请不要在响应中强制使用状态代码,也就是说,将所有内容都返回为 OK,并像您一样继续创建消息,最终您就是建立您自己的应用程序中的协议,并且您没有违反任何规则。

    【讨论】:

      【解决方案3】:

      当服务器的响应不是你所期望的时,错误回调将被执行。

      例如HTTP 404/500 错误信息(无效的 ajax url),超时....

      在您的情况下,您可以将附加参数“成功”添加到 JSON 响应。

      public JsonResult Edit(int? id)
      {
         if(id==null)
         {
            return Json(new { success = false, message = "Bad Request" }, JsonRequestBehavior.AllowGet);
         }
      
         car carTmp = db.car.Find(id);
         if (carTmp == null)
         {
            return Json(new { success = false, message = "Not Found" }, JsonRequestBehavior.AllowGet);
         }
      
         return Json(new { success = true, data = carTmp }, JsonRequestBehavior.AllowGet);
      }
      

      然后在 javascript 中你可以处理你的结果

      $.getJSON("Edit/" + data, function (result) {
          if(result.success){
              console.log(result.data);
          } else {
              console.log(result.message);
          }  
      })
      

      【讨论】:

      • 我认为添加 Response.StatusCode = (int)HttpStatusCode.NotFound ajax 不会执行成功回调,但错误....在您的 javascript 中,您只放置了成功回调
      • 您可以删除 Response.StatusCode = (int)HttpStatusCode.NotFound 然后在成功回调中处理您的响应
      猜你喜欢
      • 2012-02-05
      • 2016-01-28
      • 2012-07-11
      • 2014-11-13
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多