0

I used jquery.unobtrusive-ajax in my view. In this view, there is a form that is submit via ajax.

In the action if the modelsets is invalid, I will return the errors through the code below

 Response.StatusCode = (int)HttpStatusCode.BadRequest;
 return Json(new { errors = ModelState.Values.SelectMany(v => v.Errors) });

And in the view through the code below I show the errors to the user.

        function failed(err1) {
        obj = JSON.parse(err1.responseText).errors;
        console.log(obj);
        EmptyValidationErrors();
        jQuery.each(obj, function (i) {
            //alert(obj[i].ErrorMessage);
            AddValidationError(obj[i].ErrorMessage);
            ShowValidationErrors();
        });
    }

SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

Salman
  • 5
  • 4

1 Answers1

0

CustomErrors mode

It's IIS behavior to handle responses whith 400 http code. So, you need to remove that line

Response.StatusCode = (int)HttpStatusCode.BadRequest;

and add extra data to your response. like this:

if (ModelState.IsValid) {
  return Json(new { success = true });
}

return Json(new { success = false, errors = ModelState.Values.SelectMany(v => v.Errors) });

And read this in your JS code like this:

$.ajax({
  url: url,
  method: 'POST',
  success: function(data) {
    if (!data.success) {
      $.each(data.errors, function(i, error) {
         AddValidationError(error.ErrorMessage);
      });
      ShowValidationErrors();
    }
  }
});

In your Web.config you can find section like that:

<customErrors mode="Off">
</customErrors>

mode="Off" rewrite to mode="On" during deploy process, so in production any responses whith 400 code handle by another way, than while debugging. In Web.Release.config you can find what exactly rewriting in this section

Update

Another solution:

Response.TrySkipIisCustomErrors = true;
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return Json(new { errors = ModelState.Values.SelectMany(v => v.Errors) });

This will stop handling custom error mode="On" and resposne will contains your json with errors.

Alex
  • 1,373
  • 8
  • 15