2009-12-17 231 views
2

此問題基於標題爲「ASP.NET MVC相對路徑」的類似問題,位於hereASP.NET MVC和Javascript內的相對路徑

我知道在開發ASP.NET應用程序時,絕對路徑和相對路徑會出現問題......尤其是ASP.NET MVC應用程序。在整個應用生命週期,我一直在使用類似以下內容在我的ASPX頁面來解決路徑:

<script type="text/javascript" src="<%=Url.Content("~/Scripts/jquery-1.2.6.js")%>"></script> 

我無法離開的路徑爲相對的,因爲它正從發展層次搬來搬去到登臺層到生產層,它可能駐留在IIS中稍微不同的文件夾結構中。

但是,我的問題是我能做些什麼關於JavaScript文件中的相對路徑?他們如何解決?到目前爲止,我已經將每個頁面的Javascript嵌入到頁面本身中,所以我可以使用類似於上面的方法來解析URL。這導致在Javascript看起來像這樣:

$(function() { 
    $.getJSON('<%= Url.Content("~/home/test/1") %>', null, function(data) { 
     // Do stuff in here 
    }); 
}); 

,直到我謹一切就ASP.NET頁面,進入位於中心的JavaScript文件這工作得很好,當然。作爲建議由上述question

或者您可以使用document.location.host 的javascript內建立完全合格的路徑名 : document.location.host + 「/內容/圖片/ MYIMAGE .jpg文件」

另一種方法是讓ASP.NET 構建腳本 的這部分動態,以便充分 限定路徑名是injected.You 可以通過使用 ScriptManager.RegisterStartupScript或做 ScriptManager.RegisterScriptBlock

應用程序是一個相當沉重的Javascript用戶,所以我不能確定第二個選項是去工作。除第一個選項外,是否有更好的方法來解決這個問題?你們做了什麼來解決這個問題?任何幫助將不勝感激。謝謝。

回答

3

一種方法是讓你的JS腳本引用一個對象,並且這個對象將在包含你需要的相對路徑的view/partial中構造。然後你的JS文件代碼可以使用這個對象來根據需要實例化路徑。

一種痛苦,而是將工作,如:

var paths = 
{ 
    imagePath: '<%= Url.Content("~/Content/Images/MyImage.jpg") %>' 
} 

var obj = myJSFileObject.Load(paths); 
//continue 

HTH

0

雖然我不使用MVC(還),我的Page類有腳本路徑的集合,當它被呈現時(根據需要),它們會自動添加到HTML頁面的頂部或底部。

某些腳本文件由頁面類本身從每個頁面需要的應用程序範圍的腳本列表中註冊,其他腳本文件則由各個頁面註冊。渲染時

MyPage.AddScriptBlock(Path:="{apppath}scripts/myscript.js", LoadAtTop:=True) 

Page類做​​了快速搜索/上替換,因爲它產生SCRIPT標籤爲他們:

在這兩種情況下,註冊看起來像這樣

Writer.Write(New JavascriptBlock(_ 
    thisscript.Path.Replace("{apppath}", AppPath())) 

AppPath()函數如下所示:

Private Shared pvtAppPath As String 
Public Shared Function AppPath() As String 
If pvtAppPath="" Then 
    With System.Web.HttpContext.Current.Request 
    pvtAppPath = "http://" & .Url.Host & .ApplicationPath 
    End With 
    If Not pvtAppPath.EndsWith("/") Then pvtAppPath &= "/" 
End If 
Return pvtAppPath 
End Function 

這給了我所有的功能我需要:

  1. 我可以在每個頁面上默認加載一些JavaScript文件。
  2. 我可以在單個頁面上加載一些JavaScript文件。
  3. 我可以覆蓋(1)需要從集合中刪除它。
  4. 我可以控制(對於性能)腳本是在頭部還是在身體的底部
  5. 我可以在我的開發和生產機器上使用相同的代碼。
  6. 我的腳本標籤保證以一致的方式生成。

我不知道如何適合MVC,但希望它會給你一些想法。