Базовый URL в главных страницах ASP.net с виртуальными каталогами - PullRequest
5 голосов
/ 16 марта 2010

У меня есть главная страница ASP.net. В этом мастере у меня определены все мои файлы CSS и JavaScript. У меня также есть несколько изображений, несколько кнопок и гиперссылки.

Все URL объявлены как относительные, т.е. "/scripts/ian.js"

Все работает нормально, если этот сайт является корневым, но мне нужно, чтобы он работал в виртуальном каталоге.

Моя проблема в том, что когда я размещаю этот сайт в виртуальном каталоге под корневым сайтом, все мои ссылки указывают на корневой сайт. поэтому мои ссылки указывают на www.root.com/scripts/ian.js, но должны указывать на www.root.com/virtualDir/scripts/ian.js

Я думал, что тег Base Href в заголовке поможет, но пока он, похоже, не помогает. Все ссылки по-прежнему указывают на корневой веб-сайт, когда я наводю на них указатель мыши.

Мне бы хотелось, чтобы в IIS или в файле конфигурации была единственная настройка, в которой я могу установить корневой URL-адрес, и любое изображение, сценарий или ссылка на главной странице или странице содержимого будут указывать в нужное место. *

Любые предложения или идеи приветствуются.

Спасибо

Ответы [ 5 ]

6 голосов
/ 16 марта 2010

Все URL объявлены как относительный т.е. "/scripts/ian.js"

Похоже, что это абсолютные URL, которые вы используете, а не относительные URL, поэтому, вероятно, тег <base /> не дает желаемого эффекта:

Этот атрибут указывает абсолютный URI, который действует как базовый URI для разрешение относительных URI.

- от http://www.w3.org/TR/html401/struct/links.html#h-12.4

Вы можете попробовать удалить начальный '/' из ваших URL, чтобы проверить, работает ли это?

В противном случае я склонен использовать ResolveClientUrl , чтобы обойти подобные проблемы, которые вы использовали бы так же, как другие предлагали использовать ResolveUrl :

<script type="text/javascript" src="<%= ResolveClientUrl("~/path/to/js") %>"></script>
...
<img src="<%= ResolveClientUrl("~/path/to/img") %>" alt="..." />

Надеюсь, это поможет.

2 голосов
/ 29 апреля 2011

Этот статический метод возвращает вам полный http-путь к корневой папке вашего приложения (веб-сайт или виртуальный каталог)

public static string GetAppRootUrl(bool endSlash)
{
    string host = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);

    string appRootUrl = HttpContext.Current.Request.ApplicationPath;
    if (!appRootUrl.EndsWith("/")) //a virtual
    {
        appRootUrl += "/";
    }
    if (!endSlash)
    {
        appRootUrl = appRootUrl.Substring(0, appRootUrl.Length - 1);
    }
    return host + appRootUrl;
}

Итак, вы можете написать на главной странице:

<script src="<%= Server.HtmlEncode(GetAppRootUrl(false)) %>/scripts/ian.js" language="javascript" type="text/javascript"></script>
2 голосов
/ 16 марта 2010

Большинство тегов, включая обычные теги HTML, такие как , imageи т. Д., Могут использовать ~ / в качестве корневого пути приложения, если установлен атрибут * 'runat = "server"'.

например.

<img src="~/images/test.png" runat="server" />

Это делает тег серверным тегом, и тильда заменяется корнем приложения перед возвратом вывода в браузер.

Это не работает так, как ожидалось для . Когда для тега script установлено 'runat = "server' , сценарий считается серверным javascript и выполняется попытка его выполнения.

Чтобы обойти это, вы можете добавить javascript, используя один из методов клиентского сценария регистрации . Вы можете использовать тег <% = ResolveUrl ('~')%> в теге сценария.

0 голосов
/ 12 января 2015

Итак, вчера вечером я обнаружил эту странность IIS:

<script src="/js/file.js"></script>

Не будет работать должным образом в виртуальном приложении, которое находится в подкаталоге основного сайта IIS.

Вместо этого вы ДОЛЖНЫ сделать это так:

<script src="/js/file.js" type="text/javascript"></script>

Это стандартный способ сделать это, но если вы его не ищете, вас может удивить, что этот дополнительный тег устраняет проблемы относительного пути.

0 голосов
/ 16 марта 2010

Используйте тильду (~) в своей ссылке (т.е. ~ / scrips / ian.js) ... посмотрите, работает ли она Для ссылок попробуйте Page.ResolveUrl на странице .aspx.

...