如何在MVC3中使用Ajax Post中的相对URL

时间:2012-04-25 16:14:01

标签: ajax asp.net-mvc-3 post relative-path

我有一个用单独的“.js”文件编写的Ajax post调用,我在多个页面中调用它。 我的代码如下所示:

    $.ajax({
               url: '/MyVirtualDirectory/Controller/Action',
               type: 'POST',
               dataType: 'json',
               ....
               ....
              })

每次我在服务器中更改虚拟目录时,都需要更改“URL”中的代码以使我的Ajax调用正常工作。

是否有任何方法可以使我的代码独立于IIS中的“虚拟目录”名称。?

我的申请是MVC3。

3 个答案:

答案 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代码,其余部分保持不变。