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

假设我有网站http:// localhost / virtual其中virtual是虚拟目录

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

$.getJSON("/Controller/Action") 

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

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

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

有想法该怎么解决这个吗?

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

  

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

config.contextPath +’myAppPath“。

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

这最终对我有用。

我成功使用了这个解决方案

将以下元素放在您的母版页中

 <%= 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 + "/"; 

在您的母版页中

  

使用你的baseUrl

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

获得基本url的另一种方法是

  

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

这种方法的好处是能够在其他控制器中调用动作

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

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

应用程序根路径的波形符快捷方式是ASP.NET的一个特殊function,不是URL本身的一部分。 因此,尝试在JavaScript中使用带有波浪号的URL将无法解析站点根目录,它只会给你一个文字~你可以看到。

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

  

如果您知道页面上有一个链接到该批准的更简单的方法是读取该链接的href

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

JS文件的相对路径是我找到$ .getJSON(“../ Controller / Action”)的唯一解决方案

我知道这个问题已经很老了,但我最近在努力解决这个问题,并且能够使用它来解决它

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

这在我的ajax电话中效果很好……

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

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

如果它从虚拟目录运行,或者在其他情况下生成/controller/action ,它将生成url /VIRDIR/controller/action