В своих приложениях мне часто приходится использовать относительные пути. Например, когда я ссылаюсь на JQuery, я обычно делаю так:
<script type="text/javascript" src="../Scripts/jquery-1.2.6.js"></script>
Теперь, когда я перехожу на MVC, мне нужно учитывать различные пути, которые страница может иметь относительно корня. Конечно, в прошлом это было проблемой при переписывании URL-адресов, но мне удалось обойти ее, используя согласованные пути.
Я знаю, что стандартное решение - использовать абсолютные пути, такие как:
<script type="text/javascript" src="/Scripts/jquery-1.2.6.js"></script>
но это не сработает для меня, так как во время цикла разработки мне нужно развернуть на тестовой машине, на которой приложение будет работать в виртуальном каталоге. Относительные пути корня не работают при изменении корня. Кроме того, по причинам технического обслуживания я не могу просто изменить все пути на время развертывания теста - это было бы само по себе кошмаром.
Так какое же лучшее решение?
Редактировать:
Поскольку этот вопрос все еще получает мнения и ответы, я подумал, что было бы разумно обновить его, чтобы отметить, что с Razor V2 поддержка корневых URL-адресов встроена, поэтому вы можете использовать
<img src="~/Content/MyImage.jpg">
без какого-либо синтаксиса на стороне сервера, а механизм просмотра автоматически заменяет ~ / тем, что является текущим корнем сайта.
источник
Хотя это старый пост, новые читатели должны знать, что Razor 2 и более поздние версии (по умолчанию в MVC4 +) полностью решают эту проблему.
Старый MVC3 с Razor 1:
Новый MVC4 с Razor 2 и новее:
Никакого неудобного синтаксиса, похожего на функции Razor. Никаких нестандартных тегов разметки.
Добавление к пути в любых HTML-атрибутах тильды ('~') указывает Razor 2 «просто заставить его работать», подставив правильный путь. Здорово.
источник
Критическое изменение - MVC 5
Следите за критическими изменениями в MVC 5 (из примечаний к выпуску MVC 5 )
На самом деле они не объясняют, как это сделать, но потом я нашел такой ответ :
Примечание: вы можете сначала проверить,
Request.ServerVariables
действительно ли содержит,IIS_WasUrlRewritten
чтобы убедиться, что это ваша проблема.PS. Я думал, что у меня была ситуация, когда это происходило со мной, и я получал
src="~/content/..."
URL-адреса, сгенерированные в моем HTML, но оказалось, что что-то просто не обновлялось, когда мой код компилировался. Редактирование и повторное сохранение файлов макета и страницы cshtml каким-то образом заставило что-то работать.источник
В ASP.NET я обычно использую
<img src='<%= VirtualPathUtility.ToAbsolute("~/images/logo.gif") %>' alt="Our Company Logo"/>
. Я не понимаю, почему подобное решение не должно работать в ASP.NET MVC.источник
Это то, что я использовал. Измените путь в соответствии с вашим примером.
источник
Как бы то ни было, мне очень не нравится идея засорять мое приложение тегами сервера только для разрешения путей, поэтому я провел немного больше исследований и решил использовать то, что пробовал раньше, для переписывания ссылок - фильтр ответов. Таким образом, я могу префикс всех абсолютных путей с помощью известного префикса и заменять его во время выполнения с помощью объекта Response.Filter и не беспокоиться о ненужных тегах сервера. Код размещен ниже на случай, если он кому-то поможет.
источник
Механизм представления Razor для MVC 3 упрощает и упрощает использование относительных путей виртуального корня, которые правильно разрешаются во время выполнения. Просто поместите метод Url.Content () в значение атрибута href, и он разрешится правильно.
источник
Как и Крис, я действительно терпеть не могу помещать раздутые серверные теги в мою чистую разметку просто для того, чтобы указать этой глупой штуке, чтобы она смотрела от корня вверх. Это должно быть очень простой и разумный вопрос. Но я также ненавижу мысль о необходимости писать какие-либо собственные классы C #, чтобы делать такую простую вещь, зачем мне это нужно? Что за трата времени.
Что касается меня, я просто пошел на компромисс с «совершенством» и жестко запрограммировал имя корневого пути виртуального каталога внутри своих ссылок на пути. Ну вот так:
Для разрешения URL-адреса не требуется никакой обработки на стороне сервера или кода C #, что лучше всего для производительности, хотя я знаю, что в любом случае это будет незначительно. И никакого раздутого уродливого серверного хаоса в моей красивой чистой разметке.
Мне просто придется смириться с тем, что это жестко запрограммировано и его нужно будет удалить, когда вещь перейдет в правильный домен вместо http: // MyDevServer / MyProject /
Ура
источник
Поздно к игре, но в этом посте есть очень полное описание обработки путей ASP.Net.
источник
Я использую простой вспомогательный метод. Вы можете легко использовать его в представлениях и контроллерах.
Разметка:
Вспомогательный метод:
источник
Я выбрал немного другой подход, основанный на аналогичном сообщении SO, но с гораздо меньшим количеством кода ...
http://a.shinynew.me/post/6042784654/relative-paths-in-asp-net-mvc-javascript
источник