In meinen Anwendungen muss ich häufig relative Pfade verwenden. Wenn ich zum Beispiel auf JQuery verweise, mache ich das normalerweise so:
<script type="text/javascript" src="../Scripts/jquery-1.2.6.js"></script>
Jetzt, da ich den Übergang zu MVC mache, muss ich die unterschiedlichen Pfade berücksichtigen, die eine Seite im Verhältnis zum Stamm haben kann. Dies war in der Vergangenheit natürlich ein Problem beim Umschreiben von URLs, aber ich habe es geschafft, es mithilfe konsistenter Pfade zu umgehen.
Mir ist bewusst, dass die Standardlösung darin besteht, absolute Pfade zu verwenden, wie zum Beispiel:
<script type="text/javascript" src="/Scripts/jquery-1.2.6.js"></script>
Dies funktioniert jedoch nicht für mich, da ich während des Entwicklungszyklus auf einem Testcomputer bereitstellen muss, auf dem die App in einem virtuellen Verzeichnis ausgeführt wird. Relative Root-Pfade funktionieren nicht, wenn sich der Root ändert. Außerdem kann ich aus Wartungsgründen nicht einfach alle Pfade für die Dauer der Bereitstellung des Tests ändern - das wäre an sich schon ein Albtraum.
Was ist die beste Lösung?
Bearbeiten:
Da diese Frage immer noch Ansichten und Antworten erhält, hielt ich es für ratsam, sie zu aktualisieren, um festzustellen, dass ab Razor V2 die Unterstützung für root-relative URLs integriert ist, sodass Sie sie verwenden können
<img src="~/Content/MyImage.jpg">
ohne serverseitige Syntax, und die Ansichts-Engine ersetzt ~ / automatisch durch das aktuelle Site-Stammverzeichnis.
quelle
Während eines alten Beitrags sollten neue Leser wissen, dass Razor 2 und höher (Standard in MVC4 +) dieses Problem vollständig löst.
Alte MVC3 mit Rasiermesser 1:
Neue MVC4 mit Razor 2 und höher:
Keine umständliche Razor-Funktions-ähnliche Syntax. Keine nicht standardmäßigen Markup-Tags.
Wenn Sie einem Pfad in einem HTML-Attribut eine Tilde ('~') voranstellen, wird Razor 2 angewiesen, "einfach zum Laufen zu bringen", indem Sie den richtigen Pfad ersetzen. Es ist toll.
quelle
Breaking Change - MVC 5
Achten Sie auf eine grundlegende Änderung in MVC 5 (aus den Versionshinweisen zu MVC 5 ).
Sie erklären nicht wirklich, wie es geht, aber dann fand ich diese Antwort :
Hinweis: Möglicherweise möchten Sie zuerst überprüfen, ob
Request.ServerVariables
tatsächlich enthalten istIIS_WasUrlRewritten
, um sicherzustellen, dass dies Ihr Problem ist.PS. Ich dachte, ich hätte eine Situation, in der mir dies passiert ist, und ich habe
src="~/content/..."
URLs in meinen HTML-Code generiert - aber es stellte sich heraus, dass beim Kompilieren meines Codes etwas nicht aktualisiert wurde. Das Bearbeiten und erneute Speichern der Layout- und Seiten-cshtml-Dateien hat irgendwie dazu geführt, dass etwas funktioniert.quelle
In ASP.NET verwende ich normalerweise
<img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/>
. Ich verstehe nicht, warum eine ähnliche Lösung in ASP.NET MVC nicht funktionieren sollte.quelle
Ist was ich benutzt habe. Ändern Sie den Pfad entsprechend Ihrem Beispiel.
quelle
Für das, was es wert ist, hasse ich die Idee, meine App mit Server-Tags zu verunreinigen, nur um Pfade aufzulösen. Deshalb habe ich ein bisschen mehr recherchiert und mich dafür entschieden, etwas zu verwenden, das ich zuvor versucht hatte, um Links neu zu schreiben - einen Antwortfilter. Auf diese Weise kann ich allen absoluten Pfaden ein bekanntes Präfix voranstellen und es zur Laufzeit mithilfe des Response.Filter-Objekts ersetzen, ohne mich um unnötige Server-Tags kümmern zu müssen. Der Code ist unten angegeben, falls er jemand anderem hilft.
quelle
Die Razor View Engine für MVC 3 macht es noch einfacher und sauberer, relative Pfade mit virtuellem Stamm zu verwenden, die zur Laufzeit ordnungsgemäß aufgelöst werden. Fügen Sie einfach die Url.Content () -Methode in den href-Attributwert ein, und sie wird ordnungsgemäß aufgelöst.
quelle
Wie Chris kann ich es wirklich nicht ertragen, aufgeblähte serverseitige Tags in mein sauberes Markup einfügen zu müssen, nur um der dummen Sache zu sagen, dass sie von der Wurzel nach oben schauen soll. Das sollte eine sehr einfache und vernünftige Frage sein. Aber ich hasse auch die Idee, sich die Mühe machen zu müssen, benutzerdefinierte C # -Klassen zu schreiben, um so eine einfache Sache zu machen. Warum sollte ich das tun müssen? Was für eine Zeitverschwendung.
Für mich habe ich einfach Kompromisse bei der "Perfektion" eingegangen und den Stammpfadnamen des virtuellen Verzeichnisses in meinen Pfadreferenzen fest codiert. Also so:
Keine serverseitige Verarbeitung oder C # -Code erforderlich, um die URL aufzulösen. Dies ist für die Leistung am besten, obwohl ich weiß, dass dies unabhängig davon vernachlässigbar wäre. Und kein aufgeblähtes hässliches Chaos auf der Serverseite in meinem schönen, sauberen Markup.
Ich muss nur damit leben, dass ich weiß, dass dies fest codiert ist und entfernt werden muss, wenn das Objekt auf eine richtige Domain anstatt auf http: // MyDevServer / MyProject / migriert wird.
Prost
quelle
Spät zum Spiel, aber dieser Beitrag enthält eine sehr vollständige Zusammenfassung der Behandlung von ASP.Net-Pfaden.
quelle
Ich benutze eine einfache Hilfsmethode. Sie können es einfach in den Ansichten und Controllern verwenden.
Markup:
Hilfsmethode:
quelle
Ich habe einen etwas anderen Ansatz gewählt, der auf einem ähnlichen SO-Beitrag basiert, aber mit viel weniger Code ...
http://a.shinynew.me/post/6042784654/relative-paths-in-asp-net-mvc-javascript
quelle