Правильные методы для размещения изображений и статических файлов в приложении ASP.NET MVC? - PullRequest
5 голосов
/ 24 января 2009

В стандартном шаблоне ASP.NET есть каталог "Content", куда большинство людей помещают изображения, файлы CSS и т. Д.

Например, логотип stackoverflow:

alt text
(источник: stackoverflow.com )

на самом деле ссылается на путь к серверу, содержащий 'content' в URL (просто сделайте View Source для любой страницы SO, и вы увидите это). Поэтому они, очевидно, хранят изображения в «content/images/...».

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

Редактировать: Когда-то за последние 10 лет они изменили путь - но это то, что было раньше.

Мне не особенно нравится это. Мой HTML заканчивается /content по всему этому, и его немного сложнее перенести существующие страницы, которые имеют / image. К счастью, моя таблица стилей не заканчивается content, пока я сохраняю ее в content\site.css.

Альтернативой является размещение каталога images в корне, но тогда вы получите images на том же уровне, что и Controllers и Views, что довольно ужасно.

Я задавался вопросом о попытке добавить правило перенаправления следующим образом:

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

Но этот код не работает, потому что я его только что придумал. Я мог бы использовать сторонний плагин перенаправления / перезаписи, но я хочу сохранить все «чистым» в модели MVC.

Что еще кто-нибудь нашел в этой области? Или все просто довольны дополнительными ("/content".length) байтами в своем источнике для каждого изображения, которое они обслуживают.

Ответы [ 2 ]

3 голосов
/ 24 января 2009

Честно говоря, я не думаю, что это действительно то, о чем нужно беспокоиться ... "/ Content" внесет довольно минимальный вклад в размер вашей страницы. Если вы все еще хотите это сделать, вот несколько вариантов:

Вариант 1, если вы работаете на своем собственном сервере, это проверить модуль перезаписи URL IIS: http://learn.iis.net/page.aspx/460/using-url-rewrite-module/

Вариант 2 - использовать RedirectResult или ContentResult для достижения того же эффекта в инфраструктуре MVC

Во-первых, сопоставьте маршрут «catchall» в разделе «Images /» с действием контроллера, например,

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

Убедитесь, что он находится над вашим стандартным маршрутом "{controller} / {action} / {id}". Затем в ContentController (или там, где вы решите его поместить):

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
}

Я сделал быстрый тест, и, похоже, он сработал. Дайте мне знать в комментариях, если у вас есть какие-либо проблемы!

2 голосов
/ 25 января 2009

Обычно лучше поместить изображения в другой поддомен. Причина этого заключается в том, что браузеры ограничивают количество подключений на один URL. Поэтому, если вы используете http://static.mysiste.com, теперь браузер может открывать больше одновременных подключений, поскольку он находится в другом URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...