IE prompts to open or save json result from server
Internet explorer in compatibility mode gets the data from the server in an ajax callback method, and pops-up a dialog if I want to save the data or open. How to get rid of that?
client says:
$.ajax({
type:'POST',
data: $("#UIdlgHolder > form").serialize(),
url: $("#UIdlgHolder > form").attr("action"),
success: function (开发者_高级运维data, textStatus, jqXHR) {
{
alert(data.message);
}
}
server answers:
return new JsonResult { Data = new { result = false, message = "Yay!" } };
Even though it's not supposedly the correct way, setting the content type to text/html made IE deal with this correctly for me:
return Json(result, "text/html");
Works in all the version that F12 tools gives you in IE9.
If using MVC, one way of handling this is to implement a base controller in which you override (hide) the Json(object) method as follows:
public class ExtendedController : Controller
{
protected new JsonResult Json(object data)
{
if (!Request.AcceptTypes.Contains("application/json"))
return base.Json(data, "text/plain");
else
return base.Json(data);
}
}
Now, your controllers can all inherit ExtendedController and simply call return Json(model);
...
- without modifying the response content type for those browsers which play nicely (not <=IE9 !)
- without having to remember to use
Json(data, "text/plain")
in your various Ajax action methods
This works with json requests which would otherwise display the "Open or Save" message in IE8 & IE9 such as those made by jQuery File Upload
Sounds like this SO question may be relevant to you:
How can I convince IE to simply display Application json rather than offer to download
If not:
Have you tried setting the dataType expected in the ajax options? i.e. dataType: 'json'
Have you tried other content types such as 'application/json' or 'text/javascript'
Have you tried to send your ajax request using POST method ? You could also try to set content type to 'text/x-json' while returning result from the server.
I changed the content-type to "text/html" instead of "application/json" server side before returning the response. Described it in a blog post, where other solutions have also been added:
http://blog.degree.no/2012/09/jquery-json-ie8ie9-treats-response-as-downloadable-file/
Sadly, this is just another annoying quirk of using Internet Explorer.
The simple solution is to run a small .reg file on your PC, to tell IE to automatically open .json files, rather than nag about whether to open/save it.
I've put a copy of the file you'll need here:
JSON mime type
You'll need to have Admin rights to run this.
Is above javascript code the one you're using in your web application ? If so - i would like to point few errors in it: firstly - it has an additional '{' sign in definition of 'success' callback function secondly - it has no ')' sign after definition of ajax callback. Valid code should look like:
$.ajax({
type:'POST',
data: 'args',
url: '@Url.Action("PostBack")',
success: function (data, textStatus, jqXHR) {
alert(data.message);
}
});
try using above code - it gave me 'Yay' alert on all 3 IE versions ( 7,8,9 ).
I faced this while using jQuery FileUpload plugin.
Then I took a look in their documentation, most exactly in the Content-Type Negotiation section and followed their suggestion for Ruby/Rails.
render(json: <some-data>, content_type: request.format)
Which fixed the issue for me.
Quick Explanation: for old IE/Opera versions, this plugin will use an iframe with text/plain
or text/html
content-type, so if you force the response to json
, browser will try download it. Using the same content-type as in the request will make it work for any browser.
In my case, IE11 seems to behave that way when there is some JS syntax error in the console (doesn't matter where exactly) and dataType: 'json'
has no effect at all.
精彩评论