【问题标题】:Internet Explorer renders entire view within a partial updateInternet Explorer 在部分更新中呈现整个视图
【发布时间】:2016-10-31 13:46:48
【问题描述】:
  • ASP.NET MVC 5
  • jQuery 1.11.3

为这篇长文道歉,但我真的需要朝正确的方向轻推,因为我看不出这里有什么问题。

以下内容适用于 Chrome、Firefox,但 IE 不适用。

正确的结果如下所示:

但在 IE 11 中,错误结果如下:

在皮肤下,有一些 JavaScript 通过一些 AJAX 回调对 MVC 控制器进行更新:

//Applies the selected filter from the values selected in the drop down
function ApplyFilter() {
    var brandSelected = $('#filterBrand').val();
    var cruiseLengthSelected = $('#filterCruiseLength').val();
    var departureDateSelected = $('#filterDepartureDate').val();
    var departureFromSelected = $('#filterDepartFrom').val();
    var regionSelected = $('#filterRegion').val();
    var shipSelected = $('#filterShip').val();

    cruisesTemplate.UiBlock('.entire-page');
    cruisesTemplate.UiSetBusy('.entire-page');

    $.ajax({
        url: '/cruises/currentcruiselistfilterset?' +
            'aBrandId=' +
            brandSelected +
            '&aCruiseLength=' +
            cruiseLengthSelected +
            '&aDepartureDate=' +
            departureDateSelected.replace(' ', '_') +
            '&aRegionHierarchyItemId=' +
            regionSelected +
            '&aDepartureFromHierarchyItemId=' +
            departureFromSelected +
            '&aShipId=' +
            shipSelected
    })
        .error(function (xhr, status, error) {
            cruisesTemplate.UiClearBlock('.entire-page');
            cruisesTemplate.UiClearBusy('.entire-page');
        })
        .success(function (data) {
            $.ajax({
                dataType: 'html',
                type: 'GET',
                url: window.location.href
            })
                .error(function (xhr, status, error) {
                    cruisesTemplate.UiClearBlock('.entire-page');
                    cruisesTemplate.UiClearBusy('.entire-page');
                })
                .success(function (data) {
                    $('#results').html(data);

                    //Now refresh the filter bar
                    $.ajax({
                        dataType: 'html',
                        type: 'GET',
                        url: '/cruises/filterbarrefresh'
                    })
                        .error(function (xhr, status, error) {
                            cruisesTemplate.UiClearBlock('.entire-page');
                            cruisesTemplate.UiClearBusy('.entire-page');
                        })
                        .success(function (data) {
                            $('#filter-bar').html(data);
                            cruisesTemplate.UiClearBlock('.entire-page');
                            cruisesTemplate.UiClearBusy('.entire-page');
                        });
                });
        });
}

我唯一能想到的是,这要么是时间问题(不太可能),要么可能是与 url: window.location.href(更有可能)相关的时间问题导致问题。

编辑: 看来明确 url: window.location.href 是问题所在,因为在我看到以下 AJAX 请求的浏览器中起作用:

https://localhost/cruises/filterbarrefresh https://localhost/departing/australia/cruises https://localhost/cruises/currentcruiselistfilterset?abrandid=8&acruiselength=0&adeparturedate=january_2015&aregionhierarchyitemid=1&adeparturefromhierarchyitemid=73&ashipid=0

而在 IE 中,我只看到此 AJAX 请求(因此,当我们执行完整页面请求时,整个站点会在更新区域内更新:

https://localhost/departing/australia/cruises

我还验证了这不是described here 的jQuery.html() 问题。使用虚拟硬编码字符串或 $("#container").empty().append(data);模式仍然会导致相同的 IE 不良行为。

/编辑:

我的基本问题是:

  • 如何在不更改现有 JS 逻辑的情况下使其在 IE(以及 Chrome、Firefox 等)中工作?
  • 我是否遗漏了一些关于 jQuery、Promises 等方面的基本知识,就如何实现这是不好的做法?

非常感谢所有指针和建议。

【问题讨论】:

  • 你为什么使用window.location.href而不是@Url.Action()?并且以您在第一次通话中的方式生成您的网址是不好的做法。您还应该使用url: @Url.Action("currentcruiselistfilterset", "cruises"), 并使用data: { aBrandId: brandSelected, aCruiseLength: cruiseLengthSelected, etc } 发送参数
  • @StephenMuecke 理解并同意这种不好的做法,我将在本地审查和更新我的代码。然而,这对 IE 所做的事情与其他浏览器完全不同这一事实没有任何影响。知道为什么 IE 正在做它正在做的事情吗?
  • 您是否对在 IE 中的工作方式有所不同感到惊讶 :)。但是无论如何,你有那些链接的 ajax 调用。第一个是调用currentcruiselistfilterset(),你会得到一些数据(不确定是html还是json),但你从来没有对这些数据做任何事情(它只是被扔掉了)。然后在成功回调中对location.href返回的url(即当前页面的url)进行另一个ajax调用以更新DOM。
  • 其实第三次ajax调用的目的是什么。为什么要更新过滤栏?看看这个网站,它所做的只是用它之前的样子来更新它
  • 第三次调用是让过滤器栏反映当前选择,因为它与显示的内容不符。

标签: javascript jquery asp.net asp.net-mvc internet-explorer


【解决方案1】:

这里的解决方案最终关闭了 jQuery AJAX 调用的缓存,所以:

$.ajax({cache: false;});

【讨论】:

    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多