2011-09-29 11 views
23

mam kodKorzystanie Server.MapPath w MVC3

string xsltPath = System.Web.HttpContext.Current.Server.MapPath(@"App_Data") + "\\" + TransformFileName 

Zwraca

C:\inetpub\wwwroot\websiteName\SERVICENAME\App_Data\FileName.xsl

Dlaczego otrzymuję ścieżkę do ServiceController, SERVICENAME? Chcę ścieżkę do App_Data, który jest w

C:\inetpub\wwwroot\websiteName\App_Data\FileName.xsl

Odpowiedz

57

Musisz określić, że chcesz zacząć od korzenia wirtualnym:

string xsltPath = Path.Combine(System.Web.HttpContext.Current.Server.MapPath(@"~/App_Data"), TransformFileName); 

Dodatkowo, lepiej praktyką jest stosowanie Path.Combine połączyć ścieżki zamiast łączyć łańcuchy. Path.Combine zapewnia, że ​​nie znajdziesz się w sytuacji z separatorami o podwójnej ścieżce.

EDIT:

można zdefiniować „bezwzględne” i ścieżki „względne” i ich porównanie do „fizycznych” i „wirtualnych” ścieżek?

MSDN ma good explanation na ścieżkach względnych, fizycznych i wirtualnych. Spójrz tam.

+0

To działa. Czytałem artykuł o "wirtualnym root", ale nie podążałem za nim dobrze. http://www.dotnetperls.com/mappath Czy potrafisz zdefiniować ścieżki "bezwzględne" i "względne" oraz ich porównanie ze ścieżkami "fizycznymi" i "wirtualnymi"? –

+1

@ P.Brian.Mackey: Absolute oznacza ścieżkę od katalogu głównego, na przykład "/ someTopDirectory/someSubDirectory". Względny oznacza ścieżkę, z której aktualnie się znajdujesz, więc jeśli jesteś w "someSubDirectory" i chcesz dostać się do "someTopDirectory", względną ścieżką jest ".." (przejdź do jednego katalogu). Ścieżki fizyczne są ścieżkami, tak jak je widzi system: "C: \ inetpub \ myApp \ someTopDirectory \ someSubDirectory". Ścieżki wirtualne są widoczne w aplikacji serwera WWW: "/ someTopDirectory/someSubDirectory". –

+0

@ P.Brian.Mackey: Aby lepiej wyjaśnić sytuację, MapPath konwertuje ścieżkę wirtualną na ścieżkę fizyczną. W swoim parametrze ścieżki wirtualnej chcesz podać bezwzględną ścieżkę zamiast względnej. Znacznik wskazujący "root" dla bezwzględnej ścieżki w aplikacji internetowej to "~", czyli bezwzględny wirtualny root = "~ /". –

0

Spróbuj zrobić tak, jak to (@"~/App_Data"). ~/ reprezentuje katalog główny.

6

Odpowiedzi udzielone do tej pory są to, czego szukasz, ale myślę, że w danym przypadku, co rzeczywiste zapotrzebowanie to:

AppDomain.CurrentDomain.GetData("DataDirectory").ToString() 

To będzie jeszcze zwrócić ścieżkę do katalogu App_Data jeśli nazwa tego katalogu zmieni się w przyszłych wersjach MVC lub ASP.NET.

+0

Nie sądzę, że jest to szczególnie dobry pomysł. Opierasz się na nieudokumentowanym (oficjalnie) parametrze AppDomain, jest to szczegół implementacji. Jest o wiele bardziej prawdopodobne, że zmieni się niż "App_Data". – vcsjones

+0

Jest to udokumentowane i standardowe, ale dotyczy to w szczególności ADO.Net, a nie ASP.Net. 'DataDirectory' nie zmieni się, ale nie zawsze może wskazywać na" App_Data ". – codekaizen