I am using jQuery $.post to post some data to an ActionResult method inside my controller. When an error is thrown in the controller, it should return the error message within the responseText of the response but it's not working.
The post request is hitting the controller.
The callback function fail seems to be triggered. Just not getting the error message returned. Not sure what I am doing wrong?
This is jQuery posting data:
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
});
});
Controllers
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);
}
}
Update What's interesting is that if I move some of the logic from out of the BaseController and into the MyController, I am able to get the desired result.
Why would this happen?
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");
}
}
Messagedoesn't come back asxhr.ResponseText = ""GetSomeData(ids);after this you redirect to index action, what is inIndexand you had not passed any data fromGetSomethingtoindex.fail(function (xhr, textStatus, errorThrown) { alert(xhr.responseText); //xhr.responseText is empty });function.