我正在编写带有几个选项卡的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/