2010-01-22 149 views
17

说我有网站 http://localhost/virtual 其中虚拟是虚拟目录的Javascript虚拟目录不知道虚拟目录的

我有一个JavaScript文件中使用JQuery

$.getJSON("/Controller/Action") 

定义一个Ajax请求当这个被调用时,客户端试图在根级找到url,例如: http://localhost/Controller/Action

如果我添加代字号(〜)符号在,它变成 http://localhost/virtual/~/Controller/Action

应该(如果它是做什么我想)解析 http://localhost/virtual/Controller/Action

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

+0

似乎不是一种方式,所以我刚刚放置了一个相对路径,例如../Controller/Action – Dann

+0

如果您告诉我们预期的输出,它会有所帮助。你只告诉我们你不想要的两个输出。你想要什么? – slebetman

+0

我希望它被输出为http:// localhost/virtual/Controller/Action – Dann

回答

22

阿库的提示上面看的权利,但它不想为我工作。最后,我于是在没有虚拟目录这种情况下想出了使用它像这样

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

,然后在我的JavaScript我使用这样的

config.contextPath +“myAppPath”。

解析为 “/” +“myAppPath” 并在此解析为 “/ VirtualPath /” + +“myAppPath”

,这终于为我工作的虚拟目录的情况下。

+0

为我精心制作!简单:) –

2

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

+0

不,它只是添加到Path中。如果js文件位于根目录下,它可能会工作。 – Dann

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'); 
0

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

14

我用这个解决方案成功

将下面的元素在你的母版

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

在主JavaScript文件

var baseUrl = ""; 

集声明一个全局变量baseUrl的值为“HiddenCurrentUrl”当您的JavaScript加载时

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") 
+0

我认为这是答案,因为它很时髦,我喜欢jQuery和MVC的混合。虽然我可能会使用diff来使用Url.Action,因为子串的东西并不那么干净 – Dann

+0

很棒,你发现这有帮助!我对Url.Action解决方案不满意,请告诉我最终如何解决它。我讨厌网址的东西。总是在开发/测试/产品环境之间出现问题。 – Andreas

+0

我投票了。它很时髦,但我现在无法想到更优雅的解决方案,而且这种方法很聪明。 –

4

另一种方式来获得一个基本URL是

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

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

这种方法的好处是来调用其他控制器的动作就像一个能力,使

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

我知道这个问题是很老,但我最近这个问题苦苦挣扎,并能够使用

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

这部作品在我的Ajax调用极大地解决它......

0

实在是太迟到回答这个问题。但是,如果我有同样的问题,可能对某人有用。而不是采取上述答案中提到的所有步骤,更好的方法是使用

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

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