2009-01-23 6 views
5

Il y a un répertoire dans le modèle standard ASP.NET "Content" où la plupart des gens semblent mettre en images et fichiers css etc.Des pratiques correctes pour savoir où placer des images et des fichiers statiques dans une application ASP.NET MVC?

Pour logo exemple stackoverflow:

alt text http://www.stackoverflow.com/Content/Img/stackoverflow-logo-250.png

est en fait référé à avec un chemin de serveur contenant «contenu» dans l'URL (juste faire View Source pour toute la page SO et vous verrez cela). Donc, ils stockent évidemment des images dans "content/images/...".

src="/Content/Img/stackoverflow-logo-250.png" 

Je n'aime pas particulièrement cela. Mon HTML se termine par /content partout, et il est légèrement plus difficile de migrer les pages existantes qui ont juste/image. Heureusement ma feuille de style ne se termine pas avec content partout, tant que je l'enregistre dans content\site.css.

Une alternative est de mettre un répertoire images dans la racine, mais vous obtenez images au même niveau que Controllers et Views ce qui est assez horrible.

Je était demandé d'essayer d'ajouter une règle de redirection comme ceci:

routes.RedirectRoute(
    "images rule", 
    "Images/{*}", 
    "Content/Images/{1}"); // this is NOT valid code - I made it up 

Mais cela ne fonctionne pas de code parce que je l'ai inventée. Je pourrais utiliser un plug-in de redirection/réécriture par un tiers, mais je veux que tout reste «pur» dans le modèle MVC.

Qu'est-ce que quelqu'un d'autre a trouvé dans ce domaine? Ou est tout le monde juste heureux avec ("/content".length) octets supplémentaires dans leur source pour chaque image qu'ils servent.

Répondre

3

Pour être honnête, je ne pense pas que ce soit vraiment quelque chose à s'inquiéter ... "/ Content" va apporter une contribution assez minime à la taille de votre page. Si vous voulez continuer à le faire, voici quelques options:

Option 1, si vous exécutez sur votre propre serveur, est de vérifier le module de réécriture d'URL IIS: http://learn.iis.net/page.aspx/460/using-url-rewrite-module/

Option 2 est d'utiliser soit RedirectResult ou ContentResult, pour atteindre le même effet dans le cadre MVC

d'abord, tracer une route « catchall » sous « Images/» à une action de contrôleur, comme si

routes.MapRoute("ImageContent", 
       "Images/{*relativePath}", 
       new { controller = "Content", action = "Image" }) 

Assurez-vous qu'il est au-dessus votre standard "{controller}/{action}/{id}" ro ute. Puis, en ContentController (ou chaque fois que vous décidez de le mettre):

public ActionResult Image() { 
    string imagePath = RouteData.Values["relativePath"] 
    // imagePath now contains the relative path to the image! 
    // i.e. http://mysite.com/Images/Foo/Bar/Baz.png => imagePath = "Foo/Bar/Baz.png" 
    // Either Redirect, or load the file from Content/Images/{imagePath} and transmit it 
} 

J'ai fait un test rapide, et il semble fonctionner. Faites-moi savoir dans les commentaires si vous avez des problèmes!

+0

en fait s'inquiéter du nombre supplémentaire d'octets était ma tentative à une blague. Je n'aime pas voir .Il ne se sent pas juste, mais si c'est la convention établie alors c'est ok. Votre implémentation est belle et propre. merci –

2

Il est généralement préférable de placer les images sous un sous-domaine différent. La raison en est que les navigateurs limitent le nombre de connexions par URL. Donc, si vous utilisez http://static.mysiste.com maintenant le navigateur peut ouvrir plus de connexions simultanées en raison d'être dans une URL différente.

+0

en fait jsut appris à ce sujet hier. Je ne pouvais pas croire que IE ne télécharge que 2 fichiers à la fois. Je le savais limité - mais DEUX fichiers !! –

+0

Je devrai probablement écrire un helper Html pour écrire une balise d'image pilotée par la confuguration pour déterminer la racine de mes images. cela aurait l'avantage d'arrêter d'ajouter du contenu à toutes mes images. Html.Image ("images/backgrounds/1.jpg") qui irait à config pour le chemin de base –

Questions connexes