2011-02-23 81 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