98 votes

ASP.NET MVC Chemins relatifs

Dans mes applications, je dois souvent utiliser des chemins relatifs. Par exemple, lorsque je fais 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 avec la 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 est d'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 fonctionnera dans un répertoire virtuel. Les chemins relatifs à la 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.

Quelle est donc la meilleure solution ?

Edit :

Puisque cette question reçoit toujours des avis et des réponses, j'ai pensé qu'il serait prudent de la mettre à jour pour signaler que depuis Razor V2, la prise en charge des urls relatives à la racine est intégrée, de sorte que vous pouvez utiliser

<img src="~/Content/MyImage.jpg">

sans aucune syntaxe côté serveur, et le moteur d'affichage remplace automatiquement ~/ par la racine actuelle du site.

92voto

Tim Scott Points 7043

Essayez ça :

<script type="text/javascript" src="<%=Url.Content("~/Scripts/jquery-1.2.6.js")%>"></script>

Ou utilisez MvcContrib et faire ça :

<%=Html.ScriptInclude("~/Content/Script/jquery.1.2.6.js")%>

51voto

Charles Burns Points 3745

Bien qu'il s'agisse d'un vieux post, les nouveaux lecteurs doivent savoir que Razor 2 et plus (par défaut dans MVC4+) résout complètement ce problème.

Ancien MVC3 avec Razor 1 :

<a href="@Url.Content("~/Home")">Application home page</a>

Nouveau MVC4 avec Razor 2 et plus :

<a href="~/Home">Application home page</a>

Pas de syntaxe maladroite de type fonction Razor. Aucune balise de balisage non standard.

Le fait de préfixer un chemin d'accès dans n'importe quel attribut HTML par un tilde ('~') indique à Razor 2 de "faire en sorte que ça marche" en substituant le chemin d'accès correct. C'est génial.

10voto

Simon_Weaver Points 31141

Changement radical - MVC 5

Attention à un changement de rupture dans MVC 5 (du Notes de publication de MVC 5 )

Url Rewrite et Tilde(~)

Après la mise à niveau vers ASP.NET Razor 3 ou ASP.NET MVC 5, la notation tilde(~) peut ne plus fonctionner correctement si vous utilisez des réécritures d'URL. La réécriture d'URL affecte la notation du tilde(~) dans les éléments HTML tels que <A/> , <SCRIPT/> , <LINK/> et, par conséquent, le tilde ne correspond plus à le répertoire racine.

Par exemple, si vous réécrivez les requêtes de asp.net/contenu a asp.net , l'attribut href dans <A href="~/content/"/> se résout à /content/content/ au lieu de / . Pour supprimer ce changement, vous pouvez régler le site IIS_WasUrlRewritten (en anglais) à false dans chaque page Web ou dans Demande_Début dans Global.asax.

Ils n'expliquent pas vraiment comment faire, mais ensuite j'ai trouvé cette réponse :

Si vous utilisez le mode Pipeline intégré d'IIS 7, essayez d'ajouter les éléments suivants suivante dans votre Global.asax :

 protected void Application_BeginRequest(object sender, EventArgs e)
 {
     Request.ServerVariables.Remove("IIS_WasUrlRewritten");
 }

Remarque : vous pouvez vérifier Request.ServerVariables contient en fait IIS_WasUrlRewritten d'abord pour être sûr que c'est bien là que se situe votre problème.


PS. Je pensais avoir une situation où cela m'arrivait et où je recevais src="~/content/..." Les URLs sont générés dans mon HTML - mais il s'est avéré que quelque chose n'était pas actualisé lors de la compilation de mon code. En modifiant et en réenregistrant les fichiers Layout et page cshtml, j'ai réussi à faire fonctionner quelque chose.

6voto

David Kemp Points 5711

En ASP.NET, j'utilise généralement <img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/> . Je ne vois pas pourquoi une solution similaire ne pourrait pas fonctionner dans ASP.NET MVC.

6voto

Jesper Palm Points 5280
<script src="<%=ResolveUrl("~/Scripts/jquery-1.2.6.min.js") %>" type="text/javascript"></script>

C'est ce que j'ai utilisé. Changez le chemin pour qu'il corresponde à votre exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X