2016-09-29 10 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

はいエラーを与えない、それは? contrに到達するオレラー。コントローラに例外がスローされた場合、alert(data.Message)を置くと 'Message'は' xhr.ResponseText = "" ' – jgill09

+0

に戻りません。警告の前に( '完了!');何が起こった? – DanielVorph

答えて

1

あなたはThrowJsonError機能で設定された無効なStatusDescriptionを持っているので、これが発生しています。 Httpヘッダーに予期しない結果を引き起こす改行文字があります。あなたの最初の例では、フィードとあなたがex.ToString()を呼び出すための情報をスタックトレースあなたが行が含まれる構築された新しいExceptionMessageプロパティにStatusDescriptionを設定しているため問題は難読化されているthis related question

を参照してください。あなただけex.MessageからStatusDescriptionを設定しているため、2番目の1が動作し、それは(あなたが本当に何のためにそれを必要としないので、

は、安全のために、あなたはおそらくとにかく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

関連する問題