XMLHttpRequest отличается в IE8 от FireFox / Chrome - PullRequest
3 голосов
/ 29 сентября 2010

У меня проблема, похожая на jQuery $ .ajax Не работает в IE8, но работает на FireFox & Chrome , но с другим вариантом использования.

Я использую плагин jQuery Form для обработки загрузки файла на контроллер ASP.NET MVC, который отправляет файл для анализа и обработки.Если возникает исключение, оно должно предупредить пользователя о проблеме.

//client side code
//make an ajax call, sending the contents of the file
                    $("#ajaxUploadForm").ajaxSubmit({
                        dataType: 'json',
                        url: '/plan/Something/ExcelImport',
                        iframe: true,
                        beforeSend: function () {
                            $(".ui-dialog-buttonpane").find("#my_progress").fadeIn();
                        },
                        success: function (data, textStatus) {
                            output = "<center><span class='flash'>" + data.message + "</span></center>";
                            $("#flash_message").html(output).fadeIn('slow');
                            setTimeout(function () { $("#flash_message").fadeOut() }, 5000);
                            cleanup();
                        },
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
                            alert("XMLHttpRequest is " + XMLHttpRequest);
                            var contents = "";
                            for (prop in XMLHttpRequest) {
                                contents += "\na property is " + prop + " it's value is " + XMLHttpRequest[prop];
                            }
                            alert("the contents are " + contents);
                            alert("textStatus is " + textStatus);
                            alert("errorThrown is " + errorThrown);
                            //comes back in an HTML envelope. This should be parsed with regex, but I can't get it to work. Dirty hack
                            response = XMLHttpRequest.responseText.substring(XMLHttpRequest.responseText.indexOf("<body>"));
                            response = response.replace("<body>", "");
                            response = response.replace("</body>", "");
                            alert("There was a problem with the upload.\r\n" + response);
                        },
                        complete: function (XMLHttpRequest, textStatus) {
                            $(".ui-dialog-buttonpane").find("#my_progress").remove();
                            something_import.dialog('close');
                            something_import.dialog('destroy');
                        }
                    });

//server side code
public FileUploadJsonResult ExcelImport()
    {
        FileUploadJsonResult result = new FileUploadJsonResult();
        HttpPostedFileBase hpf = Request.Files[0] as HttpPostedFileBase;
        if (hpf.ContentLength == 0)
            return new FileUploadJsonResult { Data = new { message = "File contained no data" } };
        String fileName = Path.GetFileName(hpf.FileName);
        String timeStampedFile = fileName.Insert(fileName.IndexOf('.'),"_"+DateTime.Now.ToFileTimeUtc());
        string savedFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "tempo", timeStampedFile);
        hpf.SaveAs(savedFileName);
        try
        {
            result = ProcessFile(savedFileName, Request["Id"]) as FileUploadJsonResult;
        }
        catch (ArgumentException e)
        {
            this.Response.StatusCode = 500;
            this.Response.StatusDescription = System.Net.HttpStatusCode.BadRequest.ToString();
            Response.Write(e.Message);
            result = Json(new { message = e.Message, stackTrace = e.StackTrace }) as FileUploadJsonResult;  
        }
        return result;
    }

Это прекрасно работает в Chrome и Firefox.В IE возвращаемый объект XMLHttpRequest отличается:

FF: alt text

IE: alt text

Я искал различия между браузеромреализации XMLHttpRequest, но не нашли ничего, что конкретно касается этого случая.Загнаны в угол.

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

Причина, по которой это происходит, заключается в том, что iframe использует запасную стратегию, которую использует ajaxSubmit.Я думаю, что поскольку ответ публикуется в iframe, IE пытается выяснить, как его опустить, и решает, что он хочет попросить вас загрузить ответ, а не просто вставить его в iframe.

.Я столкнулся с этой же ситуацией некоторое время назад и нашел статью (которую я не могу найти сейчас), в которой предлагается обходной путь.

Если вы окружите свой ответ json textareaникто не будет жаловаться (IE, FF, Chrome, возможно, Safari), и вы получите правильный анализ вашего ответа.

Например, если вы возвращаете

{Id: 1, Name: 'Me'}

, просто верните:

<textarea>{Id: 1, Name: 'Me'}</textarea>

Теперь вы видите, что IE думает, что это html, поэтому он вставляет его в скрытый iframe.Ваша ajaxSubmit функция по-прежнему вызывается и правильно анализирует JSON, а затем все становятся довольны.:)

Если вы используете ASP.NET MVC, вы можете безбожно скопировать этот метод расширения:)

public static class ControllerExtensions
{
    public static ActionResult JsonSafe(this IController controller, object obj)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        return new WriteResult(string.Format("<textarea>{0}</textarea>", serializer.Serialize(obj)));
    }
}
1 голос
/ 30 сентября 2010

Статья в Википедии о XMLHttpRequest , кажется, дает хороший обзор истории XMLHttpRequest.Кажется, что Microsoft и Mozilla разработали / приняли свои собственные версии объекта и, следовательно, почему вы, вероятно, видите разные свойства.

Вот ссылка на реализацию Microsoft членов интерфейса XMLHttpRequest , которые, похоже, соответствуют свойствам вашего оповещения.

Вот ссылка на реализацию Mozilla в XMLHttpRequest .

Так что пока мы ждем, пока W3C стандартизирует XMLHttpRequest, вы по-прежнему будете иметь различные реализации в браузерах, которые вы видите в этом случае.

Для некоторого дополнительного удовольствия здесь есть Спецификации Apple и Opera в XMLHttpRequest.

...