Reputation: 3945
MVC App, client makes request to server, error happens, want to send the msg back to the client. Tried HttpStatusCodeResult but just returns a 404 with no message, I need the details of the error sent back to the client.
public ActionResult GetPLUAndDeptInfo(string authCode)
{
try
{
//code everything works fine
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return new HttpStatusCodeResult(404, "Error in cloud - GetPLUInfo" + ex.Message);
}
}
Upvotes: 43
Views: 173344
Reputation: 11
When the client can be configured to handle exceptions.
IActionResult GetData(string id)
{
try
{
// code
}
catch (Exception ex)
{
throw new Exception("<CustomMessage>", ex);
}
}
When the client just needs a response string.
IActionResult GetData(string id)
{
try
{
// code
}
catch (Exception ex)
{
return "<ERCODE>:"+ex.Message;
}
}
Upvotes: 0
Reputation: 29
Not sure if this applies for everyone but I had a similar issue where I was returning a result to an AJAX call in my view and I wanted the custom error message to appear, and this article solved it perfectly for me (ASP.NET MVC 5 ajax error statusText is always "error").
TLDR.
Response.TrySkipIisCustomErrors = true; Response.StatusCode = (int)HttpStatusCode.BadRequest; Response.ContentType = "text/plain"; return Content("Error" + Environment.NewLine + ex.Message);
Upvotes: 0
Reputation: 218732
You need to return a view which has a friendly error message to the user
catch (Exception ex)
{
// to do :log error
return View("Error");
}
You should not be showing the internal details of your exception(like exception stacktrace etc) to the user. You should be logging the relevant information to your error log so that you can go through it and fix the issue.
If your request is an ajax request, You may return a JSON response with a proper status flag which client can evaluate and do further actions
[HttpPost]
public ActionResult Create(CustomerVM model)
{
try
{
//save customer
return Json(new { status="success",message="customer created"});
}
catch(Exception ex)
{
//to do: log error
return Json(new { status="error",message="error creating customer"});
}
}
If you want to show the error in the form user submitted, You may use ModelState.AddModelError
method along with the Html helper methods like Html.ValidationSummary
etc to show the error to the user in the form he submitted.
Upvotes: 38
Reputation: 381
Inside Controller Action you can access HttpContext.Response. There you can set the response status as in the following listing.
[HttpPost]
public ActionResult PostViaAjax()
{
var body = Request.BinaryRead(Request.TotalBytes);
var result = Content(JsonError(new Dictionary<string, string>()
{
{"err", "Some error!"}
}), "application/json; charset=utf-8");
HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
return result;
}
Upvotes: 19
Reputation: 1291
IN your view insert
@Html.ValidationMessage("Error")
then in the controller after you use new in your model
var model = new yourmodel();
try{
[...]
}catch(Exception ex){
ModelState.AddModelError("Error", ex.Message);
return View(model);
}
Upvotes: 6
Reputation: 67898
One approach would be to just use the ModelState
:
ModelState.AddModelError("", "Error in cloud - GetPLUInfo" + ex.Message);
and then on the view do something like this:
@Html.ValidationSummary()
where you want the errors to display. If there are no errors, it won't display, but if there are you'll get a section that lists all the errors.
Upvotes: 27