虚拟目录中的Javascript不知道虚拟目录

时间:2010-01-22 11:10:44

标签: javascript jquery asp.net-mvc virtual-directory

说我有这个网站     http://localhost/virtual 其中virtual是虚拟目录

我有一个使用JQuery在javascript文件中定义的Ajax请求

$.getJSON("/Controller/Action")

调用此方法时,客户端会尝试在根级别找到该网址,即     http://localhost/Controller/Action

如果我添加波浪号(〜)符号,它将变为     http://localhost/virtual/~/Controller/Action

它应该(如果它是我想要的那样)决心     http://localhost/virtual/Controller/Action

有关如何解决此问题的任何想法?

8 个答案:

答案 0 :(得分:24)

阿库的上面的暗示看起来没错,但它不想为我工作。最后我想出来像这样使用它

<script type="text/javascript">
    var config = {
        contextPath: '<%= @Url.Content("~")  %>'
    };
</script>

然后在我的JavaScript中我像这样使用它

config.contextPath +'myAppPath“。

因此,如果没有虚拟目录,则解析为 “/”+“myAppPath” 如果是虚拟目录,则解析为 “/ VirtualPath /”+ +“myAppPath”

这最终对我有用。

答案 1 :(得分:15)

我成功使用了此解决方案

将以下元素放在母版页

<%= Html.Hidden("HiddenCurrentUrl", Url.Action("Dummy"))%>

在主javascript文件中声明一个全局变量

var baseUrl = "";

加载javascript时将baseUrl设置为“HiddenCurrentUrl”的值

baseUrl = $("#HiddenCurrentUrl").val();
baseUrl = baseUrl.substring(0, baseUrl.indexOf("Dummy"));

使用baseUrl

$.getJSON(baseUrl + "Action")

编辑改进的解决方案

在您的控制器中

ViewBag.BaseUrl = Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath + "/";

在您的母版页

<script type="text/javascript">
    var YourNameSpace = YourNameSpace || {};
    YourNameSpace.config = {
        baseUrl: "@ViewBag.BaseUrl"
    }
</script> 

使用您的baseUrl

$.getJSON(YourNameSpace.config.baseUrl + "Action")

答案 2 :(得分:4)

获取基本网址的另一种方法是

<script type="text/javascript">
  window.g_baseUrl = '@Url.Content("~")';
</script>

例如,如果您从 SomeName 虚拟目录运行应用程序,那么 window.g_baseUrl 变量将等于 / SomeName /

此方法的好处是能够在其他控制器中调用操作,如此

$.getJSON(window.g_baseUrl + "AnotherController/Action") 

答案 3 :(得分:2)

也许,$.getJSON("Controller/Action")会做什么?

答案 4 :(得分:2)

应用程序根路径的波形符快捷方式是ASP.NET的一项特殊功能,不是URL本身的一部分。因此,尝试在JavaScript中使用带有代字号的网址无法解析网站根目录,它只会为您提供文字~,如您所见。

您需要将应用程序根路径的值传递给JavaScript,以便它自己构建URL。我对ASP.NET并不熟悉,但我相信你可以这样做:

<script type="text/javscript">
    var approot= <%= JavaScriptSerializer.Serialize(Request.ApplicationPath) %>;
    ... $.getJSON(approot+'/Controller/Action') ...;
</script>

如果您知道页面上有关于该批准的链接,那么更简单的方法是阅读该链接的href

var approot= $('#homepagelink').attr('href');

答案 5 :(得分:0)

JS文件的相对路径是我找到的唯一解决方案     $ .getJSON( “../控制器/动作”)

答案 6 :(得分:0)

我知道这个问题很老但我最近在努力解决这个问题并且能够使用

来解决它
  url:'<%=VirtualPathUtility.ToAbsolute("~/Include/cntrols/Data.aspx") %>',

这在我的ajax电话中很有用......

答案 7 :(得分:0)

回答这个问题为时已晚。但由于我遇到同样的问题,可能对某些人有用。而不是执行上述答案中提到的所有这些步骤,更好的方法是使用

Url.Action('action','controller')

如果网址从虚拟目录运行,则会生成网址/VIRDIR/controller/action,或者在其他情况下生成/controller/action