21

假设我有网站 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

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

4

8 回答 8

25

Aku 上面的提示看起来是对的,但它不想为我工作。最后我想出像这样使用它

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

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

config.contextPath + 'myAppPath"。

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

这终于对我有用。

于 2011-09-23T05:19:12.277 回答
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")
于 2010-06-30T09:10:22.570 回答
4

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

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

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

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

$.getJSON(window.g_baseUrl + "AnotherController/Action") 
于 2011-08-01T10:28:30.917 回答
2

也许,$.getJSON("Controller/Action")会吗?

于 2010-01-22T11:13:47.733 回答
2

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

您需要将应用程序根路径的值传递给 JavaScript,以便它可以自己构造 URL。我对 ASP.NET 不太熟悉,但我相信您可以执行以下操作:

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

如果您知道页面上有指向 approot 的链接,那么更简单的方法是阅读该href链接的链接:

var approot= $('#homepagelink').attr('href');
于 2010-01-22T12:30:31.830 回答
0

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

于 2010-01-24T11:38:28.260 回答
0

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

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

这在我的ajax调用中效果很好......

于 2012-11-20T14:36:10.500 回答
0

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

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

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

于 2017-03-31T18:26:24.133 回答