Как использовать эквивалент Control.ResolveUrl для разрешения относительных URL-адресов для таблиц стилей? - PullRequest
1 голос
/ 11 августа 2011

Я использую следующий стиль, чтобы гарантировать, что независимо от того, что URL моей текущей страницы, требуемые файлы скриптов всегда загружаются, то есть отображается правильный URL.

<script src='<%= ResolveUrl("~/Scripts/jquery-1.4.1.js")%>' type="text/javascript" />

Тем не менее, когда я пытаюсь подобный подход с таблицей стилей, как показано ниже, фактический код отображается.

<link href='<%=  ResolveUrl("~/Styles/Blueprint/src/reset.css") %>' rel="stylesheet" type="text/css" />

Почему это так и как я могу добиться того, что я пытаюсь, но не удается со вторым примером?

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Это может быть потому, что к вашему головному элементу применен атрибут runat = "server".

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

<head runat="server">
    <link href='<%=  ResolveUrl("~/Styles/Blueprint/src/reset.css") %>' rel="stylesheet" type="text/css" />
</head>

С удаленным атрибутом он разрешает URL, как и ожидалось.


Редактировать

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

Например:

<link id="link1" href='<%=  ResolveUrl("~/Styles/Blueprint/src/reset.css") %>' rel="stylesheet" type="text/css" />

доступен из кода в качестве элемента управления HtmlLink, даже если он не помечен атрибутом runat = "server".

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

Что странно, так это то, что элемент title ведет себя таким же образом и доступен как объект HtmlTitle в коде позади, но тег script не является и должен быть явно определен как сервер runat = ", прежде чем он станет видимым в код позади.

Насколько я могу судить, у вас есть два варианта:

1 - Установить атрибут href напрямую:

<link rel="stylesheet" type="text/css" href="~/Styles/Blueprint/src/reset.css" />

Это будет иметь тот же эффект, что и использование Page.ResolveClientUrl, и разрешит URL-адрес таблицы стилей относительно страницы:

<link href="Styles/Blueprint/src/reset.css" rel="stylesheet" type="text/css" />

Или

2 - Определите ваш элемент ссылки в качестве серверного элемента управления (который в любом случае):

<link id="link1" runat="server" rel="stylesheet" type="text/css" />

И установите URL в коде:

link1.Href = ResolveUrl("~/Styles/Blueprint/src/reset.css");

Это разрешает URL-ссылку так:

<link id="link1" rel="stylesheet" type="text/css" href="/Styles/Blueprint/src/reset.css" />

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

0 голосов
/ 19 августа 2011

Я обнаружил, что следующий подход хорошо работает, и, на мой взгляд, он подходит и для более точного тега <head>:

<head id="Head1" runat="server">
    <title>Lightstone AVM</title>
    <style type="text/css">
        @import '<%# ResolveUrl("~/Styles/Blueprint/src/reset.css")%>';
        @import '<%# ResolveUrl("~/Styles/Blueprint/src/grid.css")%>';
        @import '<%# ResolveUrl("~/Styles/Site.css")%>';
        @import '<%# ResolveUrl("~/Styles/Master.css")%>';
        @import '<%# ResolveUrl("~/Styles/Nav.css")%>';
    </style>
</head>

Обратите внимание на выражения привязки данных, используемые вместо блоков рендеринга кода.Это следует совету из статьи Милана Негована Кодовые блоки внутри главных страниц, вызывающей проблему , которая очень хорошо справляется с этой странной проблемой.

NB : для этого подхода требуется следующий минимальный код для вашей главной страницы:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Parent.DataBind()
    DataBind()
End Sub
...