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

5

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

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

每次更改服务器中的虚拟目录时,我都需要更改“URL”中的代码以使我的Ajax调用工作。是否有任何方法可以使我的代码不依赖于IIS中的“虚拟目录”名称?我的应用程序是MVC3。
3个回答

14

描述

你应该使用Url.Action方法。但在你的情况下,由于分离的js文件,你无法访问这个方法。因此,我会在你的视图中为每个url创建一个javascript变量。然后你可以在js文件中使用这个变量。

UrlHelper.Action 方法 - 生成到操作方法的完全限定URL。

示例

你的视图

<script type="text/javascript">
    var myUrl = '@Url.Action("actionName", "controllerName")';
</script>

<script type="text/javascript" src="yourJsFile.js"/>

你的 js 文件

$.ajax({
       url: myUrl,
       ....
})

更新

另一种方法是在视图中将您的URL存储在隐藏字段中,并在js文件中获取隐藏字段的值。

更多信息


我尝试了这种方法。但是我的URL在我的js文件中无法访问。我尝试警示(myUrl),但是错误显示为"MyUrl未定义"。有什么线索吗? - 3lokh
@Nikhil 你在视图中的 <script> 块后面引用了你的 js 文件吗? - dknaack
是的,我在视图内的脚本块之后引用了我的脚本。 - 3lokh
2
我认为这个解决方案非常直接和简单。 - bignermo

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,
   ....})

基本思路是检查URL是否为localhost和端口号。如果两者都存在,则意味着我正在本地机器上进行调试,因此我不需要在URL中使用虚拟目录。如果我运行托管版本,则我的URL中将没有localhost和端口号(假设我在端口80上托管)。
通过这种方式,当我在本地机器上运行调试时,URL仅为Controller/Action,而当我托管时,URL将为VirtualDirectory/Action/Controller。现在对我来说很好用。
但是,如果有其他简单的方法,请告诉我。

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代码,而无需进行任何更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接