Robert
Robert

Reputation: 400

jQuery $.ajax success not firing from JsonResult

My code makes an ajax call:

$.ajax({
    url: "/Controller/EmailUserKeys",
    dataType: 'json',
    success: function () {
        alert('success');
    },
    error: function () {
        alert('error');
    }
});

It calls an action in my controller which returns some JSON:

public JsonResult EmailUserKeys(string UserId)
{
    ...
    return Json(new { success = true });
}

My problem is that the ajax error function is called and not the ajax success function.

Why?

PS. If my action returns "return null;", the ajax success function is called.

Upvotes: 1

Views: 8911

Answers (2)

Rob Angelier
Rob Angelier

Reputation: 2333

You should edit your code to this:

public JsonResult EmailUserKeys(string UserId)
{
    return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}

See the official documentation for more info:

http://msdn.microsoft.com/en-us/library/system.web.mvc.jsonrequestbehavior.aspx

The reason for disabling this by default is because of JSON hijacking. More information about this can be found here:

http://haacked.com/archive/2009/06/25/json-hijacking.aspx

Hope this helps you out!

Upvotes: 5

Darin Dimitrov
Darin Dimitrov

Reputation: 1039418

You must allow GET which is disabled by default when returning JSON results:

public JsonResult EmailUserKeys(string UserId)
{
    ...
    return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}

or use a POST request:

$.ajax({
    url: "/Controller/EmailUserKeys",
    type: "POST",
    dataType: 'json',
    data: { userId: 'some user id' },
    success: function () {
        alert('success');
    },
    error: function () {
        alert('error');
    }
});

Also never hardcode the url to your controller action as you did. Always use url helpers when dealing with urls in an ASP.NET MVC application:

url: "@Url.Action("EmailUserKeys", "Controller")",

And here's a piece of advice: use a javascript debugging tool such as FireBug if you are doing any web development. Among with other useful things it allows you to inspect AJAX requests. If you had used it you would have seen the response sent from the server which would have looked like this:

This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.

And you wouldn't need to come to StackOverflow and ask this question as you would have already known the answer.

Upvotes: 8

Related Questions