Dans mes applications, je dois souvent utiliser des chemins relatifs. Par exemple, lorsque je référence JQuery, je le fais généralement comme ceci:
<script type="text/javascript" src="../Scripts/jquery-1.2.6.js"></script>
Maintenant que je fais la transition vers MVC, je dois tenir compte des différents chemins qu'une page peut avoir, par rapport à la racine. C'était bien sûr un problème de réécriture d'URL dans le passé, mais j'ai réussi à le contourner en utilisant des chemins cohérents.
Je suis conscient que la solution standard consiste à utiliser des chemins absolus tels que:
<script type="text/javascript" src="/Scripts/jquery-1.2.6.js"></script>
mais cela ne fonctionnera pas pour moi car pendant le cycle de développement, je dois déployer sur une machine de test sur laquelle l'application s'exécutera dans un répertoire virtuel. Les chemins relatifs racine ne fonctionnent pas lorsque la racine change. De plus, pour des raisons de maintenance, je ne peux pas simplement changer tous les chemins pendant la durée du déploiement du test - ce serait un cauchemar en soi.
Alors, quelle est la meilleure solution?
Éditer:
Étant donné que cette question reçoit toujours des vues et des réponses, j'ai pensé qu'il pourrait être prudent de la mettre à jour pour noter qu'à partir de Razor V2, la prise en charge des URL relatives à la racine est intégrée, vous pouvez donc utiliser
<img src="~/Content/MyImage.jpg">
sans aucune syntaxe côté serveur, et le moteur de vue remplace automatiquement ~ / par quelle que soit la racine actuelle du site.
la source
Bien qu'il s'agisse d'un ancien article, les nouveaux lecteurs doivent savoir que Razor 2 et versions ultérieures (par défaut dans MVC4 +) résout complètement ce problème.
Ancien MVC3 avec Razor 1:
Nouveau MVC4 avec Razor 2 et versions ultérieures:
Pas de syntaxe de fonction Razor maladroite. Aucune balise de balisage non standard.
Le préfixe d'un chemin dans n'importe quel attribut HTML avec un tilde ('~') indique à Razor 2 de "le faire fonctionner" en remplaçant le chemin correct. C'est bien.
la source
Changement de rupture - MVC 5
Méfiez-vous d'un changement de rupture dans MVC 5 (à partir des notes de publication de MVC 5 )
Ils n'expliquent pas vraiment comment le faire, mais j'ai trouvé cette réponse :
Remarque: vous voudrez peut-être d'abord vérifier
Request.ServerVariables
contient réellementIIS_WasUrlRewritten
pour être sûr que c'est bien votre problème.PS. Je pensais que j'avais une situation où cela m'arrivait et que j'obtenais des
src="~/content/..."
URLs générées dans mon HTML - mais il s'est avéré que quelque chose n'était tout simplement pas rafraîchissant lorsque mon code était en cours de compilation. La modification et la réenregistrement des fichiers de mise en page et de page cshtml ont en quelque sorte déclenché quelque chose qui fonctionnait.la source
Dans ASP.NET, j'utilise habituellement
<img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/>
. Je ne vois pas pourquoi une solution similaire ne devrait pas fonctionner dans ASP.NET MVC.la source
C'est ce que j'ai utilisé. Changez le chemin pour correspondre à votre exemple.
la source
Pour ce que ça vaut, je déteste vraiment l'idée de joncher mon application avec des balises de serveur juste pour résoudre les chemins, alors j'ai fait un peu plus de recherches et j'ai choisi d'utiliser quelque chose que j'avais déjà essayé pour réécrire les liens - un filtre de réponse. De cette façon, je peux préfixer tous les chemins absolus avec un préfixe connu et le remplacer au moment de l'exécution à l'aide de l'objet Response.Filter sans avoir à me soucier des balises de serveur inutiles. Le code est affiché ci-dessous au cas où cela aiderait quelqu'un d'autre.
la source
Le moteur de vue Razor pour MVC 3 rend encore plus facile et plus propre l'utilisation de chemins relatifs de racine virtuelle qui sont correctement résolus au moment de l'exécution. Déposez simplement la méthode Url.Content () dans la valeur d'attribut href et elle se résoudra correctement.
la source
Comme Chris, je ne supporte vraiment pas d'avoir à mettre des balises côté serveur gonflées dans mon balisage propre uniquement pour dire à la chose stupide de regarder de la racine vers le haut. Cela devrait être une chose très simple et raisonnable à demander. Mais je déteste aussi l'idée d'avoir à faire l'effort d'écrire des classes C # personnalisées pour faire une chose aussi simple, pourquoi devrais-je le faire? Quelle perte de temps.
Pour moi, j'ai simplement compromis sur la "perfection" et codé en dur le nom du chemin racine du répertoire virtuel dans mes références de chemin. Alors comme ça:
Aucun traitement côté serveur ou code C # requis pour résoudre l'URL, ce qui est le meilleur pour les performances, même si je sais que ce serait négligeable malgré tout. Et pas de chaos gonflé et laid côté serveur dans mon joli balisage propre.
Je vais juste devoir vivre en sachant que cela est codé en dur et devra être supprimé lorsque l'objet migre vers un domaine approprié au lieu de http: // MyDevServer / MyProject /
À votre santé
la source
Tard dans le jeu, mais cet article contient un résumé très complet de la gestion des chemins ASP.Net.
la source
J'utilise une méthode d'aide simple. Vous pouvez facilement l'utiliser dans les vues et les contrôleurs.
Balisage:
Méthode d'assistance:
la source
Je suis allé avec une approche un peu différente basée sur un article SO similaire, mais avec beaucoup moins de code ...
http://a.shinynew.me/post/6042784654/relative-paths-in-asp-net-mvc-javascript
la source