2011-02-23 78 views
14

好吧,我有以下功能的JavaScript文件:相对路径问题致电

function AskReason() { 
    var answer = prompt("Please enter a reason for this action:", ""); 
    if (answer != null) 
     DoReason(answer); 
} 

function createXMLHttpRequest() { 
    try { 
     return new XMLHttpRequest(); 
    } 
    catch (e) 
    { alert('XMLHttpRequest not working'); } 
    try { 
     return new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch (e) 
    { alert('Msxml2.XMLHTT not working'); } 
    try { 
     return new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    catch (e) 
    { alert('Microsoft.XMLHTTP not working'); } 
    alert("XMLHttpRequest not supported"); 
    return null; 
} 

function DoReason(reason) { 
    var xmlHttpReq = createXMLHttpRequest(); 
    var url = "/Shared/AskReason.ashx?REASON=" + reason; 
    xmlHttpReq.open("GET", url, true); 
    xmlHttpReq.send(null); 
} 

这条线:

var url = "/Shared/AskReason.ashx?REASON=" + reason; 

是什么原因造成的问题。

在VS 2010中调试应用程序 - 此调用对我的ashx处理程序有效。

当我将项目移动到一个虚拟目录 - 例如http://localhost/myapp

这个代码将打破,我不得不改变的JavaScript这样:

var url = "http://localhost/myapp/Shared/AskReason.ashx?REASON=" + reason;

我如何能解决任何想法这是为了在两种环境中工作还是在我将应用程序部署到服务器时接受手动更改?

谢谢, 麦克

+1

不是一个修复,我会在一分钟内看起来更多 - 但是为了推出自己的AJAX方法(出于其他安全原因)是一个非常糟糕的主意 - 请查看像原型或jQuery这样的库。或者,因为你使用.NET - 使用内置的库(这是有效的jQuery) – iivel 2011-02-23 14:50:50

回答

18

Pointy's way有效,但您必须事先知道您要部署它的位置。

或者,根本就没有用/开始的相对路径:

var url = "Shared/AskReason.ashx?REASON=" + reason; 

,这将是相对于当前文档的位置解决。因此,如果当前文档是:

http://localhost/myapp/index.aspx 

...然后将解析

http://localhost/myapp/Shared/AskReason.ashx?REASON=foo 
+0

这不适合我,因为当前页面调用JS是在一个子文件夹中......但如果一切都在相同的它会工作的文件夹! – MDV2000 2011-02-23 18:52:54

+5

@ MDV2000:您仍然可以在结构中使用相对路径。例如,如果源为'http:// localhost/myapp/subfolder/index.aspx',则可以使用'../ Shared/AskReason.ashx'转到'http:// localhost/myapp/Shared/AskReason.ashx'。多个'../../'也很好。我建议保持相关应用程序中的所有路径,而不是“扎根”。 – 2011-02-23 18:58:25

+0

我其实找到了另一种方式。在我的ASP.NET代码隐藏中,我将按钮的OnClientClick设置为我的JS方法。我为该方法添加了一个参数,并通过服务器URL +虚拟目录名称,所以在JS代码中,我只是将param值连接到url以获取我想要的路径。 – MDV2000 2011-03-14 12:32:46

5

路径与一个“/”(并且没有协议&主机)开始相对于所述主机的根。如果您部署的应用程序位于“http:// whatever/myapp”,那么您的根相对路径必须以“/ myapp”开头。

当你在一个涉及某种页面模板机制的服务器端环境中工作时,一个常见的技巧就是让该部分路径成为某种配置变量,这样你就可以编写包含路径的页面:

<a href='${root}/something/something'>click me</a> 

然后,“根”变量根据配置扩展到“/ myapp”或其他。

2

的URL

 
var url = "/Shared/AskReason.ashx?REASON=" + reason; 

是寻找在根目录下的文件,[因为它是绝对路径],有效地

 
http://localhost/Shared/AskReason.ashx 

你应该包括虚拟目录的名称或确定适当的结构:

不带/会给你一个相对路径...如果你需要导航目录使用../共享/风格的记法,或最后使用您的服务器目录命令来确定您的当前路径。

+0

我在路径中添加了虚拟 - 它仍然没有工作..嗯.... – MDV2000 2011-02-23 18:54:06

2

我有一个类似的问题,其中需要一个绝对URL,但是从本地主机到生产服务器时引用中断。如果存在一个“localhost”的字符串,我解决它通过检查:

var environ = window.location.host; 

然后,你可以简单地做:

if (environ === "localhost") { 
    var baseurl = window.location.protocol + "//" + window.location.host + "/" + "shared/"; 
} else { 
    var baseurl = window.location.protocol + "//" + window.location.host + "/"; 
} 

然后你就可以在你需要引用任何网址前面加上baseurl