#asp.net #css
Вопрос:
Я создаю продукт, который мы в конечном итоге будем выпускать с белой этикеткой. Прямо сейчас я пытаюсь найти лучший способ облегчить эти требования программно, чтобы пользователь мог обновить базовый дизайн сайта (т. Е. Цвет заголовка и т. Д.) Через форму профиля/настроек.
Требования:
- Пользователь может обновить логотип (это завершено)
- Пользователь может обновлять основные элементы дизайна (на основе CSS), т. е. Цвет верхнего колонтитула, цвет нижнего колонтитула, цвет боковой панели — все основные переопределения CSS
Мы не хотим использовать ASP.Net Темы/Скины, потому что для этого требуется хранение статических тем в локальной файловой системе. Мы хотели бы использовать CSS для переопределения базового стиля и сохранения его в базе данных.
Наш первоначальный план состоит в том, чтобы сохранить CSS в простом поле varchar в базе данных и записать этот CSS на Главную страницу в событии перед инициализацией, используя «!» для переопределения базовых стилей. Является ли это лучшим решением? Если нет, что вы сделали для реализации этой функции/
Комментарии:
1. Просто примечание: вам не нужно»!», чтобы переопределить базовые стили, просто убедитесь, что переопределяющий CSS загружен позже, чем исходный. Порядок определяется порядком элементов <link>, при этом встроенный CSS всегда переопределяет любые связанные файлы.
Ответ №1:
Я был там несколько месяцев назад. Хотя использование динамического CSS, сгенерированного специальным обработчиком / сервлетом, было первым решением, для повышения производительности теперь в файле создается настраиваемый CSS, заменяющий основные элементы стандартного CSS:
<link rel="stylesheet" href="standard.css" />
<link rel="stylesheet" href="<%= customer_code %>/custom_style.css" />
...
<img scr="<%= customer_code %>/logo.png" />
Каждый пользовательский CSS будет иметь свой собственный URL-адрес, поэтому вы можете заставить браузер кэшировать их.
Это позволит вам экономить на каждом запросе, который сделают пользователи:
- трафик из базы данных на уровень приложений
- трафик с уровня приложения в браузер
- некоторые вычисления на прикладном уровне
Я поддержу идею, что пользователь должен заполнить веб-форму с подробным описанием того, какие настройки он хочет сделать.
Ответ №2:
Во-первых, определите, какие ресурсы можно заменить и можно ли добавлять ресурсы. Вам нужно будет где-то их хранить; для небольших ресурсов, таких как логотипы, база данных, вероятно, подойдет, в противном случае вам нужно беспокоиться о размере базы данных.
Затем вы можете определить, какую функциональность вы хотите настроить для пользователя: только цвета или целые стили? Если это просто цвета, вы можете определить некоторые переменные в файле CSS и динамически обслуживать файл, загружая данные из базы данных. Файл CSS может называться styles.asp и содержать код, подобный этому:
.header_area {
border: 1px solid <%=headerBorderColor%>;
background-color: <%=headerBGColor%>;
foreground-color: <%=headerFGColor%>;
}
(Синтаксис, который я использовал, — синтаксис JSP, я не знаю ASP, но идея та же.)
В качестве альтернативы, позвольте пользователю указать всю таблицу стилей, либо заменив ее по умолчанию, либо дополнив ее. Затем сохраните весь лист в базе данных и отправьте его по собственному URL-адресу (не вставляйте его на страницу).
<link rel="stylesheet" href="default_styles.css">
<link rel="stylesheet" href="white_label_css.asp">
Убедитесь, что вы правильно установили заголовки кэша и тип содержимого в файле css, если вы обслуживаете его с помощью страницы asp.
Если вас беспокоит, какой контент пользователь может поместить в файл white_label_css, вы можете ограничить его, создав пользовательский инструмент, который генерирует css и сохраняет его в бд. Например, вместо того, чтобы разрешить пользователю загружать любой файл и хранить его в базе данных, пользователь должен будет заполнить веб-форму с подробным описанием того, какие настройки он хочет выполнить. Таким образом, вы можете гарантировать, что разрешены только определенные правила/изменения css (но это может быть недостаточно гибким).
Комментарии:
1. Пользователь будет заполнять базовую форму для ввода своих стилей. Мы хотим избежать их хранения в файловой системе. Ваша идея великолепна, но нам все равно понадобится стиль по умолчанию (у некоторых пользователей может не быть своего собственного стиля).
Ответ №3:
Мне нравится идея использования динамического CSS с использованием ASP.Net Обработчик…
<link rel="stylesheet" href="style.ashx" />
стиль.ashx
<!--WebHandler Language="C#" Class="StyleSheetHandler"-->
Таблица стилей.cs
public class StyleSheetHandler : IHttpHandler {
public void ProcessRequest (HttpContext context)
{
context.Response.ContentType = "text/css";
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
string css = BuildCSSString(); //not showing this function
context.Response.Cache.SetExpires(DateTime.Now.AddSeconds(600));
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Write( css );
}
public bool IsReusable
{
get { return true; }
}
}
Функция BuildCSSString() создаст css на основе значений, хранящихся в базе данных, и вернет его, чтобы переопределить базовый стиль на главной странице.
Ответ №4:
Предложенный вами метод заключается в том, как я бы решил эту проблему: загрузите управляемые пользователем значения (возможно, только цвета и размеры шрифтов) в таблицу, связанную с пользователем.
Логотип/аватар, который вы хотите, чтобы у пользователя был, может быть сохранен в базе данных или в виде файла на fs.
Комментарии:
1. да, на данный момент мы храним логотип в БД в двоичном виде
Ответ №5:
Я думаю, это зависит от того, насколько подкованы ваши пользователи в CSS. Если они веб-разработчики или имеют такую склонность, то, вероятно, хорошо, если они пишут CSS. Если нет, вам придется либо сгенерировать его статически на основе их входных данных и сохранить в базе данных, либо вы можете просто сохранить введенные значения и динамически сгенерировать CSS с помощью пользовательского обработчика.
Подход пользовательского обработчика означал бы, что вы могли бы подставлять значения прямо в середине CSS, не беспокоясь о !важно или порядке, в котором объявлены элементы, чтобы обеспечить правильное переопределение.
Комментарии:
1. Мы не будем заставлять пользователей писать CSS. У них будет форма для изменения цвета заголовка, и мы напишем для них CSS и сохраним его
Ответ №6:
Например, с помощью php вы можете создавать динамический css, так что этого в сочетании с информацией о пользователе, хранящейся в базе данных, наверняка будет достаточно.
Ответ №7:
Если я правильно понял, вы хотите облегчить изменения, связанные с цветом и типографикой. А как насчет планировки? Если мы с уверенностью предположим, что изменятся только цвет и типография, мы можем повторно использовать одни и те же классы стилей в конце существующего базового CSS-файла и, таким образом, переопределить стили (использование !важно, хотя это хорошая идея, предотвращает переопределение пользователями их пользовательских стилей).
Эти вновь созданные классы могут быть сжаты до однострочной строки и сохранены в виде varchar, который затем будет связан/скопирован встроенно при создании страницы. Я могу придумать следующие варианты
- Встроенный CSS
- Создайте раздел файла, в который вы можете сбросить сгенерированные файлы CSS, и пусть браузеры ссылаются на это местоположение (создав программную ссылку?)
- Используйте Ajax, извлеките CSS и измените DOM
Если макет изменится, мы окажемся в более густом супе, я бы этого избежал, поскольку сложностей, связанных со сценариями/обработкой событий, слишком много.
Комментарии:
1. никаких изменений в компоновке не требуется (по крайней мере, пока). В основном просто переопределение цвета. Я склоняюсь к идее встроенного CSS, добавленного при предварительном запуске Главной страницы. Кажется, это наименее навязчиво.
Ответ №8:
Я бы не стал использовать !важное предложение и вместо этого просто обеспечил, чтобы их значения отображались в <style>
теге после импорта обычных таблиц стилей.
В противном случае я бы сделал это точно так же.
Комментарии:
1. почему бы вам не избегать использования !важно? Таким образом, мы явно переопределяем базу, даже если добавляем этот стиль после нашей базы.
2. Я вижу !важно как взлом, когда вы не можете определить источник данного стиля. Я рассматриваю это как средство в крайнем случае. Если ваш стиль следует за базовым, он должен автоматически переопределяться. В этом весь смысл каскадных таблиц стилей.