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

3lo*_*okh 5 ajax post relative-path asp.net-mvc-3

我有一个用单独的".js"文件写的Ajax帖子调用,我在多个页面中调用它.我的代码看起来像这样:

    $.ajax({
               url: '/MyVirtualDirectory/Controller/Action',
               type: 'POST',
               dataType: 'json',
               ....
               ....
              })
Run Code Online (Sandbox Code Playgroud)

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

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

我的应用程序是MVC3.

dkn*_*ack 14

描述

你应该使用这种Url.Action方法.但在你的情况下,一个单独的js文件,你无法访问此方法.所以我会为你视图中的每个网址创建一个javascript变量.然后你可以在你的js文件中使用这个变量.

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

样品

你的观点

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

<script type="text/javascript" src="yourJsFile.js"/>
Run Code Online (Sandbox Code Playgroud)

你的js文件

$.ajax({
       url: myUrl,
       ....
})
Run Code Online (Sandbox Code Playgroud)

更新

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

更多信息

  • 我发现这个解决方案非常简单明了. (2认同)

3lo*_*okh 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,
   ....})
Run Code Online (Sandbox Code Playgroud)

基本思想是检查 localhost 和端口号的 URL。如果两者都存在,则意味着我正在本地计算机中进行调试,因此我不需要 URL 中的虚拟目录。如果我运行托管版本,那么我的 URL 中不会有本地主机和端口号(假设我在端口 80 上托管)。

通过这种方式,当我在本地计算机上运行时调试时,URL 将仅为 Controller/Action,而当我托管时,URL 将是 VirtualDirectory/Action/Controller。现在对我来说效果很好。

但如果还有其他简单的方法,请留言。