我正在编写带有几个选项卡的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中,您的应用程序托管在一个虚拟目录中,您必须将该虚拟目录包含在url中。因此,正确的URL不是/home/getlabels,而是/appname/home/getlabels,这是url帮助器要考虑的内容。

另外,由于您使用的是GET请求,因此Web浏览器可能会缓存结果,而永远不会再次向服务器发送请求。为了避免这种情况,您应该在网址后附加一个随机查询字符串参数,或使用POST动词。

关于javascript - 在IIS7中托管MVC3项目时,为什么我的AJAX加载第一次失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11229196/

10-14 18:44
查看更多