Динамическое задание значений CSS с помощью ASP.NET

Я работаю над сайтом, где изображения и другие ресурсы будут находиться на отдельном домене от основного контента сайта. Мы будем использовать что-то вроде «www.example.com» для основного сайта, а затем «images.example.com» для всех дополнительных ресурсов для стилей и т. д.

При разработке сайта я буду хранить все эти ресурсы на локальном разработчике. машины. Задача здесь состоит в том, чтобы обеспечить согласованность ссылок CSS между производственным сервером и средой разработки.

Я думал о том, чтобы создать ключ web.config, в котором будет храниться URL-адрес сервера изображений. Затем при переключении с разработки на производство я мог просто изменить значение web.config, и все было бы сделано.

Есть ли способ добавить значение в файл CSS, динамически или иным образом, из какого-либо места в конфигурации или классе С#? Или я иду об этом неправильно?

Кроме того, я ограничен использованием .NET 2.0, если это имеет значение.

ОБНОВЛЕНИЕ
Чтобы немного расширить это, я знаю, что могу использовать параметр web.config для URL-адресов серверных элементов управления. Они уже генерируются динамически. Что меня больше интересует, так это то, какие варианты у меня есть для изменения (или выполнения «что-то») статических файлов CSS, которые позволят мне изменить URL-адреса для таких вещей, как ресурсы фонового изображения, на которые будут ссылаться. в CSS. Могу ли я что-нибудь сделать, кроме поиска/замены значений с помощью моей IDE? Возможно, что-то, что можно сделать автоматически с помощью сценария развертывания?


person Dan Herbert    schedule 16.01.2009    source источник


Ответы (7)


Можно ли хранить файл CSS на сервере изображений? Если это возможно, вы можете сделать все ссылки на изображения относительными, а затем вам просто нужно обновить ссылку на файл css.

<link rel="stylesheet" href="<%= ConfigurationManager.AppSettings("css-server") %>style.css" />

Если вы все еще хотите отправить или сгенерировать файл css динамически:

css файлы не должны заканчиваться на css. аспх в порядке. Вы можете сделать это:

<link rel="stylesheet" href="style.aspx" />

а затем на странице style.aspx:

protected void page_load(){
    Response.ContentType = "text/css";
    if (ConfigurationManager.AppSettings("css-server") == "local") {
        Server.Transfer("css/local.css");
    } else {
        Server.Transfer("css/production.css");
    }   
}

Если вы все еще хотите динамически генерировать файл css, я бы использовал HttpHandler, установил тип содержимого на «text/css», а затем сгенерировал css с помощью Response.Write. Если вы настаиваете на том, чтобы страница заканчивалась в css, вы всегда можете зарегистрировать css для перехода на asp.net в IIS, а затем при входящих запросах в запросе global.asax application_Begin, если файл заканчивается на .css, используйте httpcontext.current.rewritepath своему обработчику.

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

person Shawn    schedule 16.01.2009
comment
Это интересная идея, о которой я не подумал. Любая идея о том, как я могу заставить это работать с темами ASP.NET. Кажется, что это сделало бы Темы невозможными (не большая проблема, но может быть проблематичной) - person Dan Herbert; 16.01.2009
comment
вы могли бы иметь файлы css все еще в каталоге тем для генерации ссылок, но просто сделать их пустыми файлами, которые никогда не будут затронуты, поскольку путь будет переписан на ваши страницы aspx, генерирующие css. - person Shawn; 16.01.2009
comment
Мы используем этот метод для динамического изменения цветов наших сайтов в зависимости от раздела, в котором вы находитесь. - person Zhaph - Ben Duguid; 16.01.2009

Как насчет размещения заполнителя на веб-странице, а затем выбора файла CSS для использования (PROD, TEST и т. д.) во время выполнения и добавления его в ходлер места?

Я думаю, что у Update была правильная идея...

<link rel="stylesheet" href="<%= ConfigurationManager.AppSettings("css-server") %>style.css" />
person RSolberg    schedule 16.01.2009

Для меня это похоже на работу для сценария NAnt [ссылка]. С ними довольно легко работать, и они хорошо документированы.

Таким образом, ваш код не меняет ваши ссылки css, они обновляются во время развертывания. Это не проблема кода, это проблема развертывания, поэтому мне кажется более «правильным» ее решение. Таким образом, вы знаете, правильно ли он загружается (с правильными изображениями) в первый раз, когда он будет загружаться каждый раз. Сценарии NAnt хорошо иметь в своем наборе инструментов.

Другие решения будут работать, но этот код будет выполняться каждый раз при загрузке страницы для изменения, которое должно было произойти один раз — при развертывании приложения.

person jcollum    schedule 16.01.2009

Вы обманули свой собственный вопрос:

https://stackoverflow.com/questions/449236/dynamically-setting-css-values-using-asp-net

person Diodeus - James MacFarlane    schedule 16.01.2009
comment
вы должны удалить это, другой вопрос закрыт - person jcollum; 16.01.2009
comment
Похоже, это какой-то сбой SO (может быть, кнопка отправки в вопросе была дважды нажата?). Я удалил тот. - person Dan Herbert; 16.01.2009

Это распространенная проблема. Что мы делаем, так это создаем отдельные файлы web.config для каждой среды. В файле web.config есть ключ appSettings, и все значения конфигурации попадают туда вот так.

<appSettings>
<add key="ImagePath" value="d:\websites\www.site.com\www\images\" />
<appSettings>

При настройке элемента управления изображением в коде позади используйте следующее:

myImage.ImageUrl = + _

System.Configuration.ConfigurationSettings.AppSettings("ImagePath") + "image1234567890.jpg"

Просто измените свой ключ ImagePath, чтобы он соответствовал пути на рабочем сервере или сервере qa. Кроме того, вы можете указать тот же путь на тестовом сервере, но, по моему опыту, это решение работает.

person Mike    schedule 16.01.2009
comment
Это отлично сработало бы для кода на стороне сервера, но как насчет файлов CSS, которые (насколько я знаю) не могут быть изменены динамически. - person Dan Herbert; 16.01.2009

Я бы создал серверный элемент управления для моего CSS, который регистрировал блок скрипта css при загрузке страницы. Вы можете очень легко изменить все пути в этот момент программно.

person Matt Briggs    schedule 16.01.2009

Возможно, вы можете что-то сделать с файлом hosts на вашем сервере разработки? Таким образом, вам не придется фактически изменять какой-либо код.

Однако можно отправлять файлы с расширением .css через механизм asp.net. У вас также могут быть обработчики .ashx, которые возвращают действительный css и ссылаются на эти обработчики в тегах. Хотя это похоже на пустую трату процессора для материала, который на 90% состоит из статического текста.

person Al W    schedule 17.01.2009