2010-04-23 7 views
0

J'utilise l'URL Rewriting sous ASP.NET 4 (en utilisant ISAPI_Rewrite) et je constate que certaines de mes images ne se chargent pas semble que .NET ne pas comprendre que je utilise une balise html de base (assez standard et essentiel lorsque vous faites URL Rewriting):ASP.NET: images interrompues lors de la combinaison d'URL Rewriting, asp: ImageButton et balise de base html

par exemple dans mon environnement de développement que j'ai:

<base href='http://localhost/venuefinder/Website/'></base> 

et sur mes pages J'ai:

<asp:ImageButton runat="server" ImageUrl="~/images/button.gif" /> 

Sur la page d'accueil du site (http://localhost/venuefinder/Website/) cela fonctionne très bien, mais sur une page qui utilise la réécriture d'URL, l'image ne fonctionne pas:

/venuefinder/Website/venues/ashton_gate_stadium/V18639/ 

..as le navigateur tente de charger:

http://localhost/images/buttons/search-button.gif 

au lieu de:

http://localhost/venuefinder/Website/venues/images/buttons/search-button.gif 

Cela se produit parce que .NET est rendu le bouton comme:

src="../../../images/buttons/search-button.gif" 

... ce qui est incorrect.

Y at-il un moyen de corriger ce problème afin que .NET rende l'attribut src correct pour l'image? (Sans tous les ../../../ etc)

Répondre

2

Au lieu d'utiliser ~/ dans les images, créez un dossier virtuel dans IIS appelé images qui mappe à votre répertoire d'images (donc: http://localhost/images =>c:\myproject\somesubdir\content\images). Ensuite, vous pouvez utiliser

<asp:ImageButton runat="server" ImageUrl="/images/button.gif" /> 

Nous faisons cela pour tous les éléments de contenu de notre site Web (script/images/css).

Si vous utilisez <base> en HTML, le navigateur utilise l'URL donnée comme base pour les images commençant par /. Donc, dans votre cas, vous pouvez simplement laisser tomber le tilde.


L'un des avantages de l'approche du répertoire virtuel avez cependant est que vous ne jamais se soucier de la structure url de nouveau, ni dans .NET ou JS:

ScriptHelper.RegisterScript("/js/somefile.js") 

ou

$().append('<img src="/images/file.jpg"/>') 
+0

Je ne vois pas vraiment comment cela réglerait le problème? Je pensais qu'un répertoire virtuel me permettrait simplement de stocker les images ailleurs, mais dites-vous que cela change réellement le comportement de .NET lui-même? – NickG

+0

Ou vous suggérez peut-être que je le crée vraiment au niveau racine, auquel cas je ne vois pas comment cela fonctionnerait si j'avais plus d'un site Web avec ce problème? Je ne peux pas mapper localhost/images/pour plus d'un site Web (et j'ai environ 30 sites Web que je développe). – NickG

+1

Vous pouvez mapper/yourwebsite/images et définir le chemin de base de votre page sur http: // localhost/yourwebsite; alors vous pouvez toujours utiliser '/'. Comme le navigateur prend désormais/localhost/yourwebsite comme base pour les images préfixées '/. –