ASP.NET MVC Chemins Relatifs
Dans mes applications, j'ai souvent à utiliser des chemins relatifs. Par exemple, quand j'référence JQuery, j'ai l'habitude de le faire comme ceci:
<script type="text/javascript" src="../Scripts/jquery-1.2.6.js"></script>
Maintenant que je suis en train de faire la transition vers MVC, j'ai besoin de compte pour les différents chemins d'accès d'une page peut avoir, par rapport à la racine. Ce n'était évidemment un problème avec la réécriture d'URL dans le passé, mais j'ai réussi à contourner le problème en utilisant cohérente chemins.
Je suis conscient que la solution standard est d'utiliser des chemins absolus tels que:
<script type="text/javascript" src="/Scripts/jquery-1.2.6.js"></script>
mais cela ne fonctionne pas pour moi que pendant le cycle de développement, j'ai pour le déployer sur un test de la machine sur laquelle l'application va s'exécuter dans un répertoire virtuel. Racine des chemins relatifs ne fonctionnent pas lorsque la racine des changements. Aussi, pour des raisons de maintenance, je ne peux pas simplement de changer tous les chemins d'accès pour la durée de déploiement de l'épreuve - qui serait un cauchemar en soi.
Quelle est donc la meilleure solution?
Edit:
Depuis que cette question est encore recevoir des points de vue et des réponses, j'ai pensé qu'il pourrait être prudent de le mettre à jour à noter qu'à compter du Rasoir V2, soutien relatif à la racine des url est cuit, de sorte que vous pouvez utiliser
<img src="~/Content/MyImage.jpg">
sans serveur-côté de la syntaxe, et le moteur d'affichage remplace automatiquement ~/avec quelle que soit la racine du site est.
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Ou de l'utilisation MvcContrib et ce faire:
Tout en un vieux post, de nouveaux lecteurs doivent savoir que le Rasoir 2 et ultérieur (par défaut dans MVC4+) complètement résout ce problème.
Vieux MVC3 avec Rasoir 1:
Nouveau MVC4 avec Rasoir 2 et plus tard:
Pas maladroit de Rasoir fonction de syntaxe.
Aucune non-standard des balises de formatage.
Préfixant un chemin dans tout les attributs HTML avec un tilde ('~') dit Rasoir 2 à "faire fonctionner" en substituant le chemin d'accès correct. C'est génial.
Modification de rupture - MVC 5
Regarder pour une modification de rupture de changement dans MVC 5 (à partir de la MVC 5 notes de version)
Ils n'avaient pas vraiment expliquer comment le faire, mais ensuite, j'ai trouvé cette réponse:
Remarque: Vous pouvez vérifier
Request.ServerVariables
contient en faitIIS_WasUrlRewritten
d'abord pour être sûr que ce est ce que votre problème est.PS. Je pensais que j'avais une situation où ce qui m'arrivait et j'étais
src="~/content/..."
les URL générées dans mon HTML, mais il s'est avéré quelque chose n'était tout simplement pas rafraîchissant lorsque mon code a été compilé. D'édition et de réenregistrer la Mise en page et de la page cshtml fichiers en quelque sorte déclenché quelque chose à travailler.Dans ASP.NET j'ai l'habitude d'utiliser
<img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/>
.Je ne vois pas pourquoi une solution similaire ne devrait pas travailler dans ASP.NET MVC.
Est ce que j'ai utilisé. Changer de chemin pour correspondre à votre exemple.
Pour ce que ça vaut, je déteste vraiment l'idée de l'abandon de détritus mon application avec les balises de serveur seulement pour régler des chemins, j'ai donc fait une recherche un peu plus et opté pour l'utilisation de quelque chose que j'avais essayé avant de réécriture de liens - un filtre de réponse. De cette façon, je peux préfixe tous les chemins d'accès absolus avec un préfixe et de le remplacer lors de l'exécution à l'aide de la Réponse.L'objet de filtre et ne pas avoir à s'inquiéter inutilement les balises de serveur. Le code est affiché ci-dessous dans le cas où il aidera quelqu'un d'autre.
Le Rasoir moteur d'affichage pour MVC 3 rend encore plus facile et plus propre d'utiliser le virtual-relatif à la racine du chemins sont correctement réglés au moment de l'exécution. Il suffit de déposer l'Url.Contenu() la méthode dans l'attribut href de la valeur et qu'il permettra de résoudre correctement.
Comme Chris, je ne peux vraiment pas supporter d'avoir à mettre de ballonnement côté serveur balises à l'intérieur de mon propre balisage seulement de dire la chose stupide de chercher à partir de la racine vers le haut. Qui devrait être très simple, raisonnable chose à demander. Mais je déteste l'idée d'avoir à aller à l'effort de l'écriture personnalisée de classes C# pour faire une chose si simple, pourquoi devrais-je? Quel gaspillage de temps.
Pour moi, j'ai tout simplement compromis sur la "perfection" et codée en dur dans le répertoire virtuel de la racine du nom du chemin d'accès à l'intérieur de mon chemin de références. Donc comme ceci:
Pas de traitement côté serveur ou C# code nécessaire à la résolution des URL, ce qui est le mieux pour le rendement, même si je sais qu'il serait négligeable, peu importe. Et pas de ballonnement laid côté serveur chaos dans mon propre bien balisage.
Je vais devoir vivre avec, sachant que c'est codé en dur et aura besoin d'être enlevé lorsque la chose migre vers un domaine approprié au lieu de http://MyDevServer/MyProject/
Acclamations
La fin du jeu, mais ce post a un très résumé complet de la manipulation ASP.Net les chemins d'accès.
J'utilise une simple méthode d'assistance. Vous pouvez facilement l'utiliser dans les Vues et les Contrôleurs.
Balisage:
Méthode d'assistance:
Je suis allé avec un peu d'une approche différente basée sur un similaire à ce post, mais avec beaucoup moins de code...
http://a.shinynew.me/post/6042784654/relative-paths-in-asp-net-mvc-javascript