файла machine.config.
Программная установка текущей темы
Помимо задания текущей темы в файле конфигурации или в теге страницы, возможна и программная установка темы в режиме выполнения. Установку темы следует производить до инициализации страницы, например в обработчике специального нового события PreInit. Поскольку скины темы применяются до события Init, их установка в нем уже бесполезна, даже более того, попытка сделать это приведет к исключению типа InvalidOperationException. Программная установка темы может быть полезна в том случае, если вы предоставляете пользователям возможность самим выбрать себе подходящую тему из списка предустановленных тем для сайта. Предпочтительную для пользователя тему можно хранить как одно из свойств его профиля и устанавливать ее для каждой просматриваемой страницы в обработчике события PreInit. Вот пример программной установки темы для страницы:
- файл класса для получения списка тем App_CodeDAL.cs:
public class DAL
{
public string[] GetThemes()
{
// получаем список путей к подпапокам папки App_Themes
string[] folders = System.IO.Directory.GetDirectories(
System.Web.HttpContext.Current.Server.MapPath("~/App_Themes"));
// отрезаем от найденных полных путей только названия самих папок
for (int i = 0; i < folders.Length; i++)
{
folders[i] = new System.IO.DirectoryInfo(folders[i]).Name;
}
return folders;
//// Получение списка глобально-определенных тем
//string[] globalThemes = Directory.GetDirectories(
// Path.GetDirectoryName(typeof(object).Assembly.Location)
// + "ASP.NETClientFilesThemes");
}
}
- файл шаблона страницы с необходимыми контролами Default.aspx:
<%@ Page CodeFile="Default.aspx.cs" Inherits="_Default" %>
<html>
<head runat="server">
<title>Работаем с темамиtitle>
head>
<body>
<form id="pageForm" runat="server">
<div>
<asp:DropDownList ID="ddlThemeSelector" runat="server" AutoPostBack="True" DataSourceID="odsDALGetThemes" />
<asp:ObjectDataSource ID="odsDALGetThemes" runat="server" SelectMethod="GetThemes" TypeName="DAL" />
div>
form>
body>
html>
- файл кода страницы Default.aspx.cs:
public partial class _Default : System.Web.UI.Page
{
protected override void OnPreInit(System.EventArgs e)
{
if (IsPostBack && Request.Form[ddlThemeSelector.ClientID] != null)
{
// Profile.Theme = Request.Form[ddlThemeSelector.ClientID];
Page.Theme = Request.Form[ddlThemeSelector.ClientID];
}
}
protected override void OnLoad(System.EventArgs e)
{
// выделяем правильный элемент при первоначальной загрузке страницы
// это необходимо для обозначения текущей темы, заданной статически
if (!IsPostBack)
{
// заполним список данными из источника
ddlThemeSelector.DataBind();
// найдём запись текущей темы и пометим ее как выделенную
System.Web.UI.WebControls.ListItem li = ddlThemeSelector
.Items.FindByText(Theme ?? StyleSheetTheme ?? "");
if (li != null)
{
li.Selected = true;
}
}
}
}
Обратите внимание, что в коде обработки события PreInit мы не можем напрямую обращаться к выделенному элементу списка ddlThemeSelector, а вынуждены искать его в параметрах пришедшей формы. Это следствие того, что на момент наступления события PreInit значения контролов на форме еще не инициализированы своими значениями.
Подобным образом можно установить значение свойства Theme страницы, для установки свойства StyleSheetTheme подобный подход не применим. Для программной установки значения свойства StyleSheetTheme необходимо переопределить его. В нашем случае, при выборе темы из списка, код получается такой:
public override String StyleSheetTheme
{
get
{
if (Request.Form["ddlThemeSelector"] != null)
{
return Request.Form["ddlThemeSelector"];
}
return "Желтый";
}
}
Значение "ddlThemeSelector" получено из результирующего кода html: