Url.Content() не работает со сложными URL-адресами

У меня Url.Content() фрагментов везде в моих представлениях. Они отлично работают на страницах с простым URL-адресом, но не тогда, когда URL-адрес становится длиннее.

Вот пример:

<img src="@Url.Content("~/Content/Images/logo.png")" id="logo">

Это отлично работает, когда я нахожусь на домашней странице или на странице с URL-адресом localhost:8080/s/chocolate (который показывает результат поиска «шоколад».

Но когда я пытаюсь добавить некоторые уточнения, например. localhost:8080/s/chocolate/b/lindt (что означает отфильтровать предыдущие результаты только от бренда Lindt), это больше не работает. В данном случае Url.Content указывает на /s/chocolate/Content/Images/logo.png, что явно не работает.

Как будто Url.Content поднимается только на 2 уровня вверх по текущему местоположению вместо того, чтобы использовать настоящий корень веб-приложения. Я предполагаю, что в соглашении имеет смысл указывать URL-адреса в форме хост/контроллер/действие, но здесь у меня более сложная схема URL-адресов (я использую модуль перезаписи URL-адресов, чтобы сопоставить эти фрагменты URL-адресов с параметрами действия). ).

Есть ли способ указать помощнику перейти к настоящему корню или какое-либо другое решение этой проблемы?

(Кстати, я использую MVC 4)


EDIT: Как ответил Фелипе, я только что обнаружил, что Url.Content больше не нужен с MVC 4. Это работает для всех изображений «дизайна» с постоянным путем. Однако я использую много изображений, где путь построен частично с некоторыми данными, например.

<img src="@Url.Content(string.Format("~/Content/Images/stores/{0}.png", cart.Store.Retailer.Id))"/>

Я просто удалил Url.content как таковой:

<img src="@string.Format("~/Content/Images/stores/{0}.png", Model.PreferedCart.Store.Retailer.Id)"/>

При рендеринге это дает следующий src: ~/Content/Images/stores_v2/Fr_SimplyMarket.png. ~ все еще здесь, изображение не найдено. Как я могу это исправить?


person Antoine    schedule 08.07.2013    source источник


Ответы (1)


В ASP.NET MVC 4+ вам не нужно использовать Url.Content в значениях атрибутов. Используйте синтаксис ~/ напрямую и разрешите движок Razor View. 2 обработать путь для вас. Таким образом, ваши примеры могут быть закодированы следующим образом:

<img src="~/Content/Images/logo.png" id="logo">

В случае, если вам нужно создать динамический путь, вам нужно использовать Url.Content, например:

@{
   string imagePath = Url.Content("~/Content/Images/stores/" + Model.PreferedCart.Store.Retailer.Id + ".png");
}
<img src="@imagePath"/>

Если это не работает, причина в том, что у вас проблемы с переписыванием URL.

person Felipe Oriani    schedule 08.07.2013
comment
Это работает как шарм, но я пытаюсь получить изображения из папки App_Data, а не из папки Content. Почему-то не работает. Любые идеи для него - person Naveed Abbas; 11.06.2017