为什么在 IIS7 中托管 MVC3 项目时,我的 AJAX 加载第一次失败

Why does my AJAX loading fail the first time through when hosting my MVC3 project in IIS7?

本文关键字:我的 AJAX 加载 失败 第一次 项目 IIS7 MVC3 为什么      更新时间:2023-09-26

我正在编写一个带有几个选项卡的 mvc 应用程序。我注意到,当托管在IIS 7上时,主页有一个链接,触发JavaScript函数通过AJAX加载内容。

它在第一页加载时不起作用,但是当我访问其他选项卡并返回主页并单击链接时,它可以完美运行。有人可以告诉我这的原因或如何避免它吗?

加载代码

function GetLabels(project) {
    var xmlHttp;
    if (window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest();
    }
    else {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlHttp.onreadystatechange = function () {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            document.getElementById("light").innerHTML = xmlHttp.responseText;
        }
    }
    xmlHttp.open("GET", "/Home/GetLabels?project="+project, true);
    xmlHttp.send();
    document.getElementById('light').style.display = 'block';
    document.getElementById('fade').style.display = 'block';
    document.getElementById("light").innerHTML = 
       "<img src='Content/load.gif' alt='Please wait' />";
}

触发它的链接

Click <a href="javascript:void(0)" onclick="GetLabels('A')">here</a>

你不应该像这样硬编码网址:

xmlHttp.open("GET", "/Home/GetLabels?project="+project, true);

您应该始终使用 url 帮助程序来生成它们:

xmlHttp.open("GET", "@Url.Action("GetLabels", "Home")?project=" + encodeURIComponent(project), true);

现在,无论您在Visual Studio的内置服务器还是IIS中托管,您的AJAX请求都将起作用。您的代码在 IIS 中不起作用的原因是,在 IIS 中,您的应用程序托管在 ni 一个虚拟目录中,您必须包含在您的 url 中。因此,正确的 url 不是/home/getlabels而是/appname/home/getlabels这是 url 帮助程序考虑的事情。

此外,由于您使用的是GET请求,因此Web浏览器可能会缓存结果,并且永远不会再次向服务器发送请求。若要避免这种情况,应将随机查询字符串参数附加到 url 或使用 POST 谓词。