W moich aplikacjach często muszę używać ścieżek względnych. Na przykład, kiedy odwołuję się do JQuery, zwykle robię to w ten sposób:
<script type="text/javascript" src="../Scripts/jquery-1.2.6.js"></script>
Teraz, gdy przechodzę do MVC, muszę wziąć pod uwagę różne ścieżki, które może mieć strona, względem katalogu głównego. Był to oczywiście problem z przepisywaniem adresów URL w przeszłości, ale udało mi się to obejść, używając spójnych ścieżek.
Zdaję sobie sprawę, że standardowym rozwiązaniem jest użycie ścieżek bezwzględnych takich jak:
<script type="text/javascript" src="/Scripts/jquery-1.2.6.js"></script>
ale to nie zadziała, ponieważ podczas cyklu programistycznego muszę wdrożyć na maszynie testowej, na której aplikacja będzie działać w katalogu wirtualnym. Względne ścieżki główne nie działają, gdy zmienia się katalog główny. Ponadto ze względów konserwacyjnych nie mogę po prostu zmienić wszystkich ścieżek na czas wdrażania testu - to byłby koszmar sam w sobie.
Więc jakie jest najlepsze rozwiązanie?
Edytować:
Ponieważ na to pytanie wciąż pojawiają się widoki i odpowiedzi, pomyślałem, że rozsądnie byłoby zaktualizować je, aby zauważyć, że od Razor V2 obsługa adresów URL powiązanych z rootem jest wbudowana, więc możesz użyć
<img src="~/Content/MyImage.jpg">
bez żadnej składni po stronie serwera, a mechanizm widoku automatycznie zamienia ~ / na dowolny bieżący katalog główny witryny.
źródło
Chociaż jest to stary post, nowi czytelnicy powinni wiedzieć, że Razor 2 i nowsze (domyślnie w MVC4 +) całkowicie rozwiązują ten problem.
Stary MVC3 z Razor 1:
Nowy MVC4 z Razor 2 i nowszymi:
Brak niezręcznej składni podobnej do funkcji Razor. Brak niestandardowych tagów.
Prefiks ścieżki w dowolnych atrybutach HTML tyldą („~”) mówi Razorowi 2, aby „po prostu działał”, zastępując prawidłową ścieżkę. Wspaniale.
źródło
Przełomowa zmiana - MVC 5
Uważaj na przełomową zmianę w MVC 5 (z informacji o wydaniu MVC 5 )
Właściwie nie wyjaśniają, jak to zrobić, ale wtedy znalazłem tę odpowiedź :
Uwaga: możesz najpierw sprawdzić, czy
Request.ServerVariables
faktycznie zawiera on,IIS_WasUrlRewritten
aby upewnić się, że na tym polega Twój problem.PS. Wydawało mi się, że mam sytuację, w której to się dzieje i otrzymuję
src="~/content/..."
adresy URL generowane w moim HTML-u - ale okazało się, że coś nie odświeża się, gdy mój kod był kompilowany. Edytowanie i ponowne zapisywanie plików układu i strony cshtml w jakiś sposób spowodowało, że coś zadziałało.źródło
W ASP.NET zwykle używam
<img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/>
. Nie rozumiem, dlaczego podobne rozwiązanie nie powinno działać w ASP.NET MVC.źródło
Czy to, czego użyłem. Zmień ścieżkę, aby pasowała do Twojego przykładu.
źródło
Jeśli chodzi o to, co jest warte, naprawdę nienawidzę pomysłu zaśmiecania mojej aplikacji tagami serwera tylko po to, aby rozwiązać ścieżki, więc przeprowadziłem trochę więcej badań i zdecydowałem się użyć czegoś, czego próbowałem wcześniej, do przepisywania linków - filtra odpowiedzi. W ten sposób mogę poprzedzać wszystkie ścieżki bezwzględne znanym prefiksem i zastępować go w czasie wykonywania za pomocą obiektu Response.Filter i nie muszę martwić się o niepotrzebne tagi serwera. Kod jest zamieszczony poniżej na wypadek, gdyby pomógł komukolwiek innemu.
źródło
Silnik widoku Razor dla MVC 3 sprawia, że korzystanie ze ścieżek względnych wirtualnego katalogu głównego, które są poprawnie rozpoznawane w czasie wykonywania, jest jeszcze łatwiejsze i czystsze. Po prostu upuść metodę Url.Content () do wartości atrybutu href, a zostanie ona poprawnie rozwiązana.
źródło
Podobnie jak Chris, naprawdę nie mogę znieść konieczności umieszczania rozdętych tagów po stronie serwera w moim czystym znaczniku tylko po to, aby powiedzieć głupocie, aby patrzył od roota w górę. To powinno być bardzo proste i rozsądne pytanie. Ale nienawidzę też pomysłu konieczności pisania jakichkolwiek niestandardowych klas C # w celu zrobienia tak prostej rzeczy, dlaczego miałbym to robić? Co za strata czasu.
Dla mnie po prostu naraziłem się na „perfekcję” i zakodowałem na stałe nazwę ścieżki katalogu wirtualnego w moich odniesieniach do ścieżki. Więc tak:
Do rozwiązania adresu URL nie jest wymagane żadne przetwarzanie po stronie serwera ani kod C #, co jest najlepsze pod względem wydajności, chociaż wiem, że byłoby to pomijalne niezależnie od tego. I bez rozdętego, brzydkiego chaosu po stronie serwera w moim ładnym, czystym znaczniku.
Będę musiał po prostu żyć, wiedząc, że to jest zakodowane na stałe i będzie musiało zostać usunięte, gdy rzecz zostanie przeniesiona do właściwej domeny zamiast http: // MyDevServer / MyProject /
Twoje zdrowie
źródło
Spóźniona gra, ale ten post zawiera bardzo kompletne podsumowanie obsługi ścieżek ASP.Net.
źródło
Używam prostej metody pomocniczej. Możesz go łatwo używać w widokach i kontrolerach.
Narzut:
Metoda pomocnicza:
źródło
Poszedłem z nieco innym podejściem opartym na podobnym poście SO, ale z dużo mniejszą ilością kodu ...
http://a.shinynew.me/post/6042784654/relative-paths-in-asp-net-mvc-javascript
źródło