2012-09-02 45 views
36

如何解決相對於ASP.NET MVC 4應用程序根目錄的路徑?也就是說,我想從控制器操作中打開屬於應用程序的文件,如~/Data/data.html。這些路徑通常在Web.config中指定。如何解決相對於ASP.NET MVC 4應用程序根目錄的路徑?

編輯:

通過「解析」我的意思是相對於應用程序的根目錄的路徑轉換爲絕對路徑,.e.g。 ~/Data/data.htmlC:\App\Data\Data.html

+1

這就是你如何從根目錄'參考'這些文件... –

+0

@Nate你是什麼意思,〜自動擴展? – aknuds1

+0

[HttpContext.Current.Server.MapPath](http://msdn.microsoft.com/zh-cn/library/system.web.httpserverutility.mappath.aspx)? – nemesv

回答

68

得到絕對路徑使用這樣的:

String path = HttpContext.Current.Server.MapPath("~/Data/data.html"); 

編輯:

爲了得到控制器的上下文從上面的行刪除.Current。通過使用HttpContext本身,測試更容易,因爲它基於Controller的上下文,因此更加本地化。

我現在意識到,我不喜歡怎麼Server.MapPath作品(內部最終調用HostingEnvironment.MapPath)所以我現在推薦給經常使用HostingEnvironment.MapPath,因爲它的靜態,而不是依賴於上下文當然,除非你想要的......

+0

我只想讀取服務器上的文件,它不會被返回給客戶端。 – aknuds1

+0

這是做到這一點的方法。另外,如果你需要靜態使用這個,請看這個問題:http:// stackoverflow。com/questions/3795986/using-server-mappath-inside-a-static-field-in-asp-net-mvc –

+0

我在一個System.Web.Mvc.Controller子類的非靜態方法中,但是' HttpContext'沒有屬性'Current'。這是怎麼回事? – aknuds1

4

在操作,你可以撥打:

this.Request.PhysicalPath 

,在引用返回到當前控制器的物理路徑。如果你只需要根路徑電話:

this.Request.PhysicalApplicationPath 
10

剛請使用以下

Server.MapPath("~/Data/data.html") 
+0

簡單而正確。謝謝。 – CodeBreaker

47

我覺得這是非常有用的代碼,當我需要一個控制器,外部的路徑,例如當我在Global.asax.cs中初始化組件:

HostingEnvironment.MapPath("~/Data/data.html") 
+1

HostingEnvironment.MapPath是一個更好的答案。當您在http請求的上下文之外執行代碼時,則HttpContext.Current爲空,您的代碼將崩潰。 HostingEnvironment.MapPath始終有效。 – JDC

+0

也值得一提的是,如果您有自己的虛擬路徑提供程序實現,則可以自定義「HostingEnvironment.MapPath」。適用於任何「託管」環境(託管Windows服務或iis)https://support.microsoft.com/zh-cn/kb/910441 – Rikki

相關問題