2016-09-29 74 views
0

我正在使用jQuery $.post將一些數據發佈到我的控制器內的ActionResult方法。當控制器中發生錯誤時,它應該在響應的responseText中返回錯誤消息,但它不起作用。ASP.NET MVC JsonResult沒有返回jQuery.post中的responseText失敗回調函數

該發佈請求正在擊中控制器。

回調函數fail似乎被觸發。只是沒有得到返回的錯誤消息。不知道我在做什麼錯了?

這是jQuery的發佈數據:

var postData = ["1","2","3"]; 

$.post('/MyController/GetSomething', $.param(postData, true)) 
     .done(function (data) { 
       alert('Done!');       
     }) 
     .fail(function (xhr, textStatus, errorThrown) { 
       alert(xhr.responseText); //xhr.responseText is empty 
     }); 
}); 

控制器


    public class MyController : BaseController 
    { 
     public ActionResult GetSomething(List ids) 
     { 
      try 
      { 
       GetSomeData(ids); 
      } 
      catch (Exception ex) 
      { 
       return ThrowJsonError(new Exception(String.Format("The following error occurred: {0}", ex.ToString()))); 
      } 

      return RedirectToAction("Index"); 
     } 
    } 

    public class BaseController : Controller 
    { 
     public JsonResult ThrowJsonError(Exception ex) 
     { 
      Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest; 
      Response.StatusDescription = ex.Message; 

      return Json(new { Message = ex.Message }, JsonRequestBehavior.AllowGet); 
     } 
    } 

 

更新 有趣的是,如果我還可以將一些邏輯從出BaseController,進入myController的,我能夠得到理想的結果。

爲什麼會發生這種情況?

public class MyController : BaseController 
    { 
     public ActionResult GetSomething(List<string> ids) 
     { 
      try 
      { 
       GetSomeData(ids); 
      } 
      catch (Exception ex) 
      { 
       Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest; 
       Response.StatusDescription = ex.Message; 

       return Json(new { Message = ex.Message }, JsonRequestBehavior.AllowGet); 
      } 

      return RedirectToAction("Index"); 
     } 
    } 
+0

是否達到控制或之前給出一個錯誤 –

+0

是的,這?確實達到了控制奧勒。如果在Controller中拋出異常,那麼'Message'不會返回爲'xhr.ResponseText =「」' – jgill09

+0

如果你把alert(data.Message);提醒之前('完成!');發生了什麼? – DanielVorph

回答

1

出現這種情況的,因爲你有一個無效的StatusDescriptionThrowJsonError功能設定。它有換行符,這會在Http Header中導致意外的結果。見this related question

被混淆的問題,因爲你的第一個例子有您設置的StatusDescription到正在建設其中將包含換行符和堆棧跟蹤信息,因爲你叫ex.ToString()ExceptionMessage財產。第二個作品,因爲你只是設置StatusDescriptionex.Message,並且不包含問題的字符

爲了安全起見,你應該只使用一個相對良性的StatusDescription,因爲你並不真正需要它的任何東西反正(你可以在fail()Message無論哪種方式

請注意下面的代碼工作(仍然不建議這樣做)。

public ActionResult ThrowJsonError(Exception ex) 
{ 
    Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest; 
    Response.StatusDescription = ex.Message; // does not work 
    Response.StatusDescription = ex.Message.Replace('\r', ' ').Replace('\n', ' '); // works 

    return Json(new { Message = ex.Message }, JsonRequestBehavior.AllowGet); 
} 
+0

啊明白了。感謝您的幫助並花時間解釋。 – jgill09

相關問題