我有一个用单独的“.js”文件编写的Ajax post调用,我在多个页面中调用它。 我的代码如下所示:
$.ajax({
url: '/MyVirtualDirectory/Controller/Action',
type: 'POST',
dataType: 'json',
....
....
})
每次我在服务器中更改虚拟目录时,都需要更改“URL”中的代码以使我的Ajax调用正常工作。
是否有任何方法可以使我的代码独立于IIS中的“虚拟目录”名称。?
我的申请是MVC3。
答案 0 :(得分:14)
您应该使用Url.Action
方法。但在你的情况下,一个单独的js文件,你无法访问此方法。所以我会为你视图中的每个网址创建一个javascript变量。然后你可以在你的js文件中使用这个变量。
UrlHelper.Action方法 - 生成操作方法的完全限定网址。
您的观点
<script type="text/javascript">
var myUrl = '@Url.Action("actionName", "controllerName")';
</script>
<script type="text/javascript" src="yourJsFile.js"/>
您的js文件
$.ajax({
url: myUrl,
....
})
另一种方法是将您的网址存储在视图中的隐藏字段中,并获取js文件中的隐藏字段值。
答案 1 :(得分:1)
我终于找到了部分工作。 在我的.js文件中,我做了一些像这样的脏编码:
var Path = location.host;
var VirtualDirectory;
if (Path.indexOf("localhost") >= 0 && Path.indexOf(":") >= 0) {
VirtualDirectory = "";
}
else {
var pathname = window.location.pathname;
var VirtualDir = pathname.split('/');
VirtualDirectory = VirtualDir[1];
VirtualDirectory = '/' + VirtualDirectory;
}
$.ajax({
url: VirtualDirectory/Controller/Action,
....})
基本思路是检查localhost和端口号的URL。如果两者都存在,则意味着我在本地机器上进行调试,因此我不需要URL中的virtualdirectory。如果我正在运行托管版本,那么我的URL中将不会有localhost和端口号(前提是我在端口80上托管)。
通过这种方式,当我在我的本地机器上运行时,调试url将只是Controller / Action,而我托管URL将是VirtualDirectory / Action / Controller。它现在对我来说很好。
但如果有其他简单方法,请发帖。
答案 2 :(得分:0)
我认为声明一个全局Javascript变量然后第一次设置变量会更安全,可能是Home/Index
触发时。然后在每个ajax调用中重复使用它,如下所示:
$.ajax({... url: GlobalVariablePath + "Controller/Action/RouteValues" ...})
如果您已经设计了WebApp并且在部署站点时每件事情都很好并且卡住了,那么您可以像这样操作所有ajax URL:
$.ajaxSetup({
beforeSend: function (jqXHR, settings) {
settings.url = GlobalVariablePath + settings.url;
}
});
使用这种方式,您可以安全地使用现有的js代码,其余部分保持不变。