使用網站中的資源時,通常必須指定資源的路徑。例如,您可以使用 URL 路徑引用頁面中的圖像文件或網站中其他位置處的頁面的 URL。同樣,Web 應用程序中的代碼可以使用基於服務器的文件的物理文件路徑對文件進行讀寫操作。ASP.NET 提供用於引用資源並確定應用程序中的頁面或其他資源的路徑的方法。
指定資源的路徑
許多情況下,頁面中的元素或控件必須引用外部資源,如文件。ASP.NET 允許您通過各種方法引用外部資源。所選方法取決於使用客戶端元素還是服務器控件。
客戶端元素
元素(不是頁面中的服務器控件,而是客戶端元素)以原樣傳遞給瀏覽器。因此,從客戶端元素中引用資源時,應根據 HTML 中 URL 的標準規則構造路徑。可以使用完全限定(絕對)URL 路徑,也可以使用各種類型的相對路徑。例如,如果頁面包含一個 img 標記,則可以使用以下路徑之一設置其 src 屬性:
-
絕對 URL 路徑:
<img src="http://www.contoso.com/MyApplication/Images/SampleImage.jpg" />
如果引用其他位置(如外部網站)中的資源,則絕對 URL 路徑非常有用。
-
站點根目錄相對路徑,根據站點(不是應用程序)根目錄進行解析。此示例路徑假定 Images 文件夾存在於網站根目錄下:
<img src="/Images/SampleImage.jpg" />
如果您的網站爲 http://www.contoso.com,則路徑將解析爲以下形式:
http://www.contoso.com/Images/SampleImage.jpg
如果將跨應用程序的資源(如圖像或客戶端腳本文件)保留在網站根目錄下的文件夾中,則站點根目錄相對路徑非常有用。
-
根據當前頁面路徑解析的相對路徑:
<img src="Images/SampleImage.jpg" />
-
解析爲當前頁面路徑對等的相對路徑。
<img src="../Images/SampleImage.jpg" />
注意 默認情況下,瀏覽器使用當前頁面的 URL 作爲基準解析相對路徑。但是,您可以在頁面中包含 HTML base 元素,以指定替代基路徑。
服務器控件
在引用資源的 ASP.NET 服務器控件中,可以使用絕對路徑或相對路徑,這一點與客戶端元素一樣。如果使用相對路徑,則相對於頁面、用戶控件或包含該控件的主題的路徑進行解析。例如,假設 Controls 文件夾中包含一個用戶控件。該用戶控件包含一個 Image Web 服務器控件,該服務器控件的 ImageUrl 屬性設置爲以下路徑:
Images/SampleImage.jpg
該用戶控件運行時,路徑將解析爲以下形式:
/Controls/Images/SampleImage.jpg
無論承載用戶控件的頁面位置如何,都是如此。
服務器控件中的絕對和相對路徑引用具有以下缺點:
-
絕對路徑在應用程序之間是不可移植的。如果移動絕對路徑指向的應用程序,則鏈接將會中斷。
-
如果將資源或頁面移動到不同的文件夾,可能很難維護採用客戶端元素樣式的相對路徑。
爲克服這些缺點,ASP.NET 啓用了 Web 應用程序根目錄運算符 (~),在服務器控件中指定路徑時,可以使用該運算符。ASP.NET 會將 ~ 運算符解析爲當前應用程序的根目錄。可以結合使用 ~ 運算符和文件夾來指定基於當前根目錄的路徑。下面的示例演示使用 Image 服務器控件時用於指定圖像的根目錄相對路徑的 ~ 運算符:
<asp:image runat="server" id="Image1"
ImageUrl="~/Images/SampleImage.jpg" />
在該示例中,圖像文件將從 Web 應用程序根目錄下的 Images 文件夾中直接讀取,無論該頁面位於網站的什麼位置。
注意 |
---|
~ 運算符只能爲服務器控件識別,並且位於服務器代碼中。不能將 ~ 運算符用於客戶端元素。 |
可以在服務器控件中的任何與路徑有關的屬性中使用 ~ 運算符。
注意 |
---|
在主控頁中,資源的路徑基於內容頁的路徑進行解析。有關更多信息,請參見 ASP.NET 母版頁概述 。 |
確定當前網站的物理文件路徑
在應用程序中,您可能需要確定服務器上的文件或其他資源的路徑。例如,如果應用程序以編程方式對文本文件進行讀寫操作,則必須爲用於讀取和寫入的方法提供該文件的完整物理路徑。
將物理文件路徑(如 C:/Website/MyApplication)硬編碼到應用程序中並不是很好的做法,因爲如果移動或部署應用程序,則路徑會發生更改。但 是,ASP.NET 爲您提供了以編程方式獲取應用程序中的任何物理文件路徑的方法。然後,您可以使用基文件路徑創建所需資源的完整路徑。用於確定文件路徑的兩種最常用的 ASP.NET 功能是返回路徑信息的 HttpRequest 對象的屬性,以及 MapPath 方法。
注意 |
---|
不應將物理文件路徑發送到客戶端,因爲它們可能會被惡意用戶用來獲取有關您的應用程序的信息。 |
根據請求屬性確定路徑
下表列出了 HttpRequest 對象的屬性,這些屬性幫助您確定應用程序中的資源的路徑。
下面的示例假定使用以下 URL 來發出瀏覽器請求:
http://www.contoso.com/MyApplication/MyPages/Default.aspx
對於這些示例,術語“虛擬路徑”是指跟在服務器標識符後面的請求 URL 的一部分,此時虛擬路徑如下所示:
/MyApplication/MyPages/Default.aspx
此外,這些示例假定網站根目錄的物理路徑爲以下形式:
C:/inetpub/wwwroot/MyApplication/
最後,這些示例假定物理路徑包含一個名爲 MyPages 的文件夾。
屬性 | 說明 |
---|---|
獲取當前應用程序的根目錄路徑,無論在該應用程序中的什麼位置請求該路徑。對於此示例,該屬性將返回以下內容: / |
|
獲取當前請求的虛擬路徑。不同於 FilePath ,差別在於如果請求已在服務器代碼中被重定向,則 CurrentExecutionFilePath 就是正確的。對於此示例,該屬性將返回以下內容: /MyApplication/MyPages/Default.aspx 如果作爲對 Transfer 或 Execute 進行調用的結果,您獲取正在運行的代碼中的屬性,則路徑將反映該代碼的位置。 |
|
FilePath |
獲取當前請求的虛擬路徑。對於此示例,該屬性將返回以下內容: /MyApplication/MyPages/Default.aspx 不同於 CurrentExecutionFilePath ,FilePath 不反映服務器端轉換。 |
獲取當前請求的虛擬路徑。對於此示例,該屬性將返回以下內容: /MyApplication/MyPages/default.aspx |
|
獲取當前正在執行的應用程序的根目錄的物理文件系統路徑。對於此示例,該屬性將返回以下內容: C:/inetpub/wwwroot/ |
|
獲取與請求的 URL 對應的物理文件系統路徑。對於此示例,該屬性將返回以下內容: C:/inetpub/wwwroot/MyApplication/MyPages/default.aspx |
使用 MapPath 方法
MapPath 方法返回傳遞給該方法的虛擬路徑的完整物理路徑。例如,以下代碼返回網站根目錄的文件路徑:
Dim rootPath As String = Server.MapPath("~" )
String rootPath = Server.MapPath("~");
注意 |
---|
傳遞給 MapPath 方法的路徑必須爲應用程序相對路徑,而不是絕對路徑。 |