Главная страница статей --> Хитрости при программировании php, заметки по базам данных

Новое в asp.net 2 - темы и скины.

Источник: realcoding.net

Создание тем


Все создаваемые темы должны располагаться в специальной папке с зарезервированным названием App_Themes в корневой директории сайта. При использовании в качестве редактора Visual Studio эта папка будет создана автоматически, если добавить к проекту папку типа Theme (необходимо кликнуть правой кнопкой на веб-проекте, в контекстном меню выбрать пункт Add ASP.NET Folder и затем выбрать тип папки – Theme). Созданная папка и будет представлять собой тему. Каждая папка в директории App_Themes считается отдельной темой. Вложение тем друг в друга не допускается. Каждая тема обычно состоит из одного или нескольких файлов скинов с расширением ".skin", а также других, необходимых для задания внешнего вида сайта файлов, таких как файлы каскадных таблиц стилей, картинок, xsl-преобразований и так далее, которые также могут быть упорядочены в подпапках корневой директории темы. Файлы скинов и таблиц стилей обычно расположены в корне темы, а картинки - в поддиректории images. Вы можете добавить столько файлов скинов контролов, сколько это необходимо. Обычно на один тип контрола создают один файл с шаблонами, но в общем случае, один ".skin"-файл может содержать множество разнородных элементов управления. Однако если в одном файле будут храниться атрибуты только одного и файл будет назван именем этого типа, то это позволит значительно упростить поиск нужного шаблона. Например, тема может включать в себя следующие файлы: Calendar.skin, Label.skin, Button.skin, TreeView.skin, GridView.skin и т.д. Каждый из этих файлов включает все скины, относящиеся к данному типу контрола. Скин контрола – это шаблон элемента управления с настройками свойств, определяющих внешний вид контрола, которые впоследствии будут использованы для визуального представления данного контрола.

В качестве примера рассмотрим создание скина для контрола "календарь". Создадим файл Calendar.skin со следующим содержимым:

<asp:Calendar runat=server BackColor=White 
               
BorderColor=#3366CC BorderWidth=1px CellPadding=
               
DayNameFormat=Shortest Font-Names=Verdana Font-Size=8pt 
               
ForeColor=#003399 Height=200px Width=220px>
    <
SelectedDayStyle BackColor=#009999 Font-Bold=True 
                     
ForeColor=#CCFF99 />
    <
SelectorStyle BackColor=#99CCCC ForeColor=#336666 />
    <
WeekendDayStyle BackColor=#CCCCFF />
    <
OtherMonthDayStyle ForeColor=#999999 />
    <
TodayDayStyle BackColor=#99CCCC ForeColor=White />
    <
NextPrevStyle Font-Size=8pt ForeColor=#CCCCFF />
    <
DayHeaderStyle BackColor=#99CCCC ForeColor=#336666 Height=1px />
    <
TitleStyle BackColor=#003399 BorderColor=#3366CC BorderWidth=1px 
               
Font-Bold=True
               
Font-Size=10pt ForeColor=#CCCCFF Height=25px />
  </
asp:Calendar>

Шаблон контрола выглядит как обычное задание серверного элемента управления в ASCX или ASPX файле за тем лишь исключением, что в нем не указывается параметр ID. Задание атрибута runat="server" обязательно! После сохранения этого файла в папке темы и задании данной темы в качестве текущей, все контролы типа Calendar на всех страницах сайта будут выводиться так как это задано в файле скина.

Следующий пример демонстрирует применение скина к контролу типа Label:

<asp:Label runat=server ForeColor=Green />

Мы можем поместить эту строку в новый файл Label.skin нашей темы и тогда все контролы типа Label на нашем сайте будут иметь одинаковый цвет текста.

Все скины делятся на два типа – скины по умолчанию и именованные скины. Скины не содержащие атрибута SkinID являются скинами по умолчанию и применяются ко всем контролам данного типа. Для каждого типа контрола может быть определен только один скин по умолчанию. Скин с установленным атрибутомSkinID называется именованным скином. Свойства именованного скина применяются только к контролам, имеющим такое же значение атрибута SkinID, что и у скина. При отсутствии в текущей теме подходящего для контрола именованного скина, применяются настройки из скина по умолчанию.

>В следующем примере для элемента управления ярлык определяется два скина – один это скин по умолчанию с цветом текста Green и второй скин для ярлыков с сообщениями об ошибках и прочих специфических нужд с цветом текста Red.

<asp:Label runat=server ForeColor=Green />
  <
asp:Label runat=server ForeColor=Red SkinID=Error />

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

<body>
      <
form id=form1 runat=server>
      <
div>
          <
asp:Label runat=server ID=label1 
             
Text=Hello World />
          <
br />
          <
asp:Label runat=server ID=label2 
             
Text=GoodBye World SkinID=Error />
      </
div>
      </
form>
  </
body>

С помощью скинов могут быть изменены практически все свойства контрола, имеющие отношение к его внешнему виду. Все атрибуты, разрешенные для установки в скинах должны быть помечены атрибутом System.Web.UI.ThemeableAttribute="true". Однако есть ряд свойств, задание которых в скине недопустимо. Например, такие свойства как ID и EnableViewState помечены как запрещенные к установке в файлах скинов. Также не допускаются к установке через скины такие атрибуты, как CommandName класса Button, AllowPaging, DataSource класса GridView и т.д. Делается это посредством установки атрибута ThemeableAttribute="false". Атрибут ThemeableAttribute может быть применен и к классу для обозначения поддержки данным контролом настройки своих параметров через скины. В качестве примера контрола не поддерживающего темы можно привести контрол Repeater, который наследует классу Control, помеченному атрибутом Themeable="false". Любой же контрол, наследующий классу WebControl, напротив, имеет этот атрибут установленный в "true" по умолчанию.

Области действия тем


По области действия различают темы локальные и темы, определенные глобально. Локальные темы хранятся в папке App_Themes приложения и могут использоваться только в данном приложении. Глобально-определенные темы должны быть расположены в папке %SystemRoot%Microsoft.NETFrameworkv2.0.xxxxxASP.NETClientFilesThemes. Данные темы может использовать любой сайт, работающий на данной машине. При совпадении названий локальной и глобальной темы к контролам будут применяться настройки из обоих тем, но приоритет будет у свойств локальной темы.
Установка текущей темы

Есть два способа указания страницам сайта, какую из имеющихся тем им использовать. От способа указания темы будет зависеть поведение выполняющей среды при работе с темами. Так если для этого будет использован атрибут Theme, то атрибуты из скинов темы будут иметь больший приоритет, чем атрибуты установленные у контролов непосредственно на странице. В случае же использования атрибута StylesheetTheme атрибуты заданные в теге контрола будут иметь больший приоритет при отрисовке контрола, чем атрибуты, полученные из скина.

Примечание: В режиме дизайнера страницы Visual Studio не отображает свойства контролов, заданные в скинах при установленном атрибуте Theme. Однако, если задавать тему через атрибут StyleSheetTheme, то в качестве побочного действия студийный дизайнер начинает их отображать, соответственно можно посмотреть все настройки в действии без компиляции сайта и просмотра его в браузере. Также, к сожалению, студийный редактор не поддерживает IntelliSense в ".skin"-файлах. Единственным способом удобного создания скинов является создание и настройка нужного элемента на странице и последующий перенос текста контрола в ".skin"-файл с удалением лишних атрибутов (таких как ID и EnableViewState).
Установка темы для отдельной страницы

В следующем примере показан способ указания текущей темы с использованием атрибута Theme директивы @Page.

<%@ Page Language=C# AutoEventWireup=true CodeFile=Default.aspx.cs Inherits=_Default Theme=Синяя %>
  <!
DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.1//EN http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd>
  <
html xmlns=http://www.w3.org/1999/xhtml>
  <
head runat=server>
   <
title>Темы</title>
  </
head>
  <
body>
   <
form id=form1 runat=server>
    <
div>
     <
asp:Calendar ID=Calendar1 runat=server />
     <
br /><asp:Label ID=Label1 runat=Server Text=Theme />
     <
br /><asp:Label ID=Label2 ForeColor=Brown runat=Server Txt=StyleSheetTheme />
    </
div>
   </
form>
  </
body>
  </
html>

После этого, несмотря на то, что никаких настроек внешнего вида контролов на данной странице мы не делали, все контролы будет выглядеть так, как мы это задали в соответствующих файлах скинов текущей темы.

Если в данном примере заменить атрибут Theme на атрибут StylesheetTheme, то первая надпись будет выведена цветом темы, а вторая – коричневым цветом, заданным в теге контрола.

Установка темы для всего сайта


Используя файл настроек web.config, тему можно установить на уровне всего приложения (и даже на уровне целой машины, используя глобальный файл настроек machine.config). Для этого используются атрибуты theme и styleSheetTheme раздела <pages>.

<configuration xmlns=http://schemas.microsoft.com/.NetConfiguration/v2.0>
      <
system.web>
         <
pages theme=Синяя />
         <
authentication mode=Windows/>
      </
system.web>
  </
configuration>

Установка темы для всей машины


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

Чтобы задать тему для всех сайтов, работающих на данной машине необходимо присвоить требуемое значение атрибуту theme раздела <pages> глобального файла настроек machine.config, который находится в папке %SystemRoot%Microsoft.NETFrameworkv2.0.xxxxxCONFIG. Если такого раздела нет, его следует создать. Например, он может выглядеть так:

<system.web>
  <
pages buffer=true enableSessionState=true
         
enableViewState=true enableViewStateMac=true
         
autoEventWireup=true validateRequest=true
         
enablePersonalization=false theme=Синяя />
  </
system.web>

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

Примечание: Атрибуты Theme и StyleSheetTheme, определенные в директивах @Page страниц, будут переопределять значения одноименных атрибутов, заданных в конфигурационных файлах. А атрибуты, заданные в файле web.config будут иметь больший приоритет, нежели аналогичные глобальные настройки из файла machine.config.

Отключение тем


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

<asp:Label runat=server ID=label1
            
Text=Hello, from OdeToCode
            
ForeColor=Green EnableTheming=false />

Необходимо отметить, что это свойство каскадно распространяется на все вложенные контролы. Таким образом, при установке атрибута EnableTheming="false" элементу управления Panel или пользовательскому контролу, все контролы, расположенные в данном контроле, также перестанут отображаться с использованием свойств из файлов скинов.

Аналогично можно отключить темы для отдельной страницы: <%@Page EnableTheming="False" %>. Данный атрибут отключает только использование атрибута theme, для того чтобы игнорировать все установки темы, в том числе и сделанные с использованием атрибута styleSheetTheme, потребуется конструкция следующего вида:

<%@ Page Theme= StyleSheetTheme= %>

Для отключения тем на уровне всего приложения потребуется сделать подобные установки уже в файле web.config:

<configuration>
          <
system.web>
                <
pages theme= />
          </
system.web>
  </
configuration>

Соответственно для отключения тем на уровне всей машины придется править раздел <pages> файла 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.NETClientFiles\Themes);
      
}
  }

- файл шаблона страницы с необходимыми контролами 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:

<select name="ddlThemeSelector" onchange="javascript:setTimeout(__doPostBack(ddlThemeSelector,), 0)" id="ddlThemeSelector">. В данном случае мы не можем использовать конструкцию вида ddlThemeSelector.ClientID для получения имени параметра в коллекции параметров формы, поскольку в момент обращения исполняющей среды к данному свойству контролы на странице еще не существуют.

При хранении темы в профиле пользователя код будет выглядеть немного иначе:

public override String StyleSheetTheme
 
{
      
get
      
{
          if (!
Profile.IsAnonymous && Profile.Theme != null)
          {
              return
Profile.Theme;
          }
          return
Жёлтый;
      }
  }

Установка параметра SkinID для отдельного контрола идентична установке параметра Themes. Этот параметр также должен быть установлен не позднее события PreInit страницы:

protected override void OnPreInit(System.EventArgs e)
  {
      
lblFirst.SkinID = BoldStyle;
  }

Темы и каскадные таблицы стилей (CSS)


Каскадные таблицы стилей это очень мощный инструмент, позволяющий настраивать любые свойства, влияющие на внешний вид html-контролов, а также управлять их расположением на странице. Основная трудность применения таблиц стилей в ASP.NET состоит в том, что для эффективного их использования нужно досконально знать каким образом тот или иной серверный контрол интерпретируется в результирующий html исполняющей средой. Это не всегда возможно и большинство программистов серверных решений не разбираются в этом, да и не хотят разбираться, справедливо полагая, что это удел профессионалов в области html-верстки. Однако специалисты по верстке ничего не понимают в серверных тегах, поэтому не могут эффективно настраивать их, добиваясь требуемого результата. Налицо конфликт, разрешить который во многом и есть задача механизма тем, плюс используя темы достаточно просто отделить чисто дизайнерские вещи от шаблонов с самими контролами. Отныне верстальщику не придется копаться в шаблонах страниц, ненароком вырезая контролы и удаляя лишние с его точки зрения атрибуты. Теперь все настройки, касающиеся внешнего вида контрола, могут быть вынесены в отдельные файлы – файлы скинов. Однако настройка всех свойств серверных контролов в скинах неизбежно приведет к увеличению размера генерируемой страницы, поскольку все свойства из скинов будут указываться непосредственно в атрибут style тегов отдаваемых клиенту, а это достаточно длинные строки параметров. Гораздо экономнее было бы указать в скинах только специфические для серверных контролов свойства, которые не могут быть заданы через стили, а все остальные свойства задавать в таблицах стилей и указывать серверным элементам в скинах только css-классы через атрибут CssClass. К счастью тем предоставляют такую возможность. Можно добавить один или несколько ".css"-файлов в корневую папку темы или любые ее подпапки. ASP.NET автоматически применит все файлы с таблицами стилей ко всем страницам сайта, использующим выбранную тему, путем добавления директивы <link> для каждого файла в заголовок отдаваемой клиенту страницы. Единственное, что для этого необходимо – это наличие атрибута runat="server" в теге <head> страницы. Страницы создаваемые с использованием студийного редактора уже содержат этот атрибут.

Области применения скинов и таблиц стилей перекрываются. И тот и другой подходы могут быть использованы, например, для задания совершенно безумного вида отображения текстовых полей. Например, в файле скина мы можем указать такой набор свойств:

<asp:TextBox ForeColor=gray Font-Bold=true BorderColor=red runat=server />

, а можем задать соответствующий стиль через css:

input
 
{
       
border-color:Red;
       
font-weight:bold;
       
color:Gray;
  }

Однако в первом случае мы получим в результирующем html-е для каждого тектового поля на сайте запись такого вида:

<input type=text style=color:Gray;border-color:Red;font-weight:bold; />

а во втором - такого:

<input type=text />

и файл StyleSheet.css размеров 68 байт, который один раз загрузится на клиента и впоследствии уже не будет скачиваться с сайта, а будет браться из кеша браузера.

Очевидно что оптимальным подходом будет создание css-классов для контролов требующих специфичного оформления и последующее сопоставление данных классов серверным контролам через установку атрибута CssClass.

Пример задания css-класса:

.txtMad
 
{
       
border-color:Red;
       
font-weight:bold;
       
color:Gray;
  }

Пример задания класса контролу в файле скина TextBox.skin:

<asp:TextBox CssClass=txtMad runat=server />

Результирующий html:

<input type=text class=txtMad />

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

* веб-дизайнеры гораздо увереннее себя чувствуют при использовании css-файлов. Если весь дизайн для сайта делают профессиональные дизайнеры, то лучше попросить их везде использовать css. В таком случае при обновлении дизайна все, что от вас потребуется, это заменить соответствующий файл .css.
* Если дизайном занимается разработчик, то ему будет более привычна работа с скинами. Скины выглядят в точности как описания контролов, к тому же разработчику не придется вникать во все тонкости того, какой именно HTML-код генерится при рендеринге того или иного серверного контрола. Все, что от него потребуется – установка значений предопределенным свойствам серверных контролов.
* Скины применяются на стороне сервера, поэтому могут использоваться для установки специфичных свойств серверных контролов. Например, для контрола Calendar таким свойством является DayNameFormat. CSS никак не позволяет оперировать такими свойствами.
* CSS в свою очередь ориентирован на клиента и позволяет управлять параметрами отображения, недоступными на сервере. Например, положением контролов на странице, отступами и цветами страницы, оформлением ссылок и т.д.
* Настройки каскадных таблиц стилей могут быть легко переопределены при необходимости прямо на странице, свойства же, заданные в скинах, абсолютны и не могут быть переопределены (за исключением специальных приемов рассмотренных выше).
* Различные браузеры по-разному интерпретируют свойства каскадных таблиц стилей. Рендеринг свойств, заданных в скинах, может быть переопределен в зависимости от типа браузера клиента (ASP.NET предоставляет такие возможности).

Темы и изображения


В директорию темы вы можете поместить картинки. Изображения в темах особенно полезны для таких контролов, как TreeView и Menu, которые позволяют изменять стандартные изображения, используемые ими при рендеринге.

Все что от вас потребуется при этом - это указать в скине относительный путь к картинке. ASP.NET сам позаботится о приведении этого пути в корректный полный путь. В css-файлах также необходимо указывать относительные для данной темы пути.

За кулисами процесса


При получении запроса к ASP.NET 2.0 сайту исполняющая среда компилирует каждую тему из директории App_Themes в сборку. Каждая сборка содержит класс представляющий тему – этот класс является наследником класса System.Web.UI.PageTheme. Данный класс также содержит свойство LinkedStyleSheets, которое возвращает массив строк - список путей ко всем файлам с расширениями ".css", которые расположены в папке темы.

Класс также содержит свойство ControlSkins, которое реализует интерфейс IDictionary. Ключами в данном реестре являются типы (например Label или TextBox). Значениями являются делегаты на методы, которые создают контрол требуемого типа и применяют к нему все свойства, определенные для него в файле скина.

Например, наш файл скина для ярлыка компилируется в следующий метод:

private Control __BuildControl__control11(Control ctrl) {
       
Label label1 = (Label) ctrl;
       
label1.ForeColor = Color.Green;
        return
label1;
  }

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

Темы и элементы управления собственной разработки


Если вы создаете свои элементы управления, то также можете задействовать темы для своих контролов. По умолчанию ваши контролы уже должны позволять настройку через темы, если вы их наследуете от класса WebControl. Управление поддержкой тем осуществляется посредством установки атрибута EnableTheming. Например для отключения возможности настройки через темы вашего контрола используйте значение атрибута false:

namespace MyOwn.ServerControls
 
{
     [
EnableTheming(false)]
    
public class SimpleDate : WebControl {
       
private DateTime _date;
       
public DateTime Date {
          
get {return _date;}
          
set {_date =value;}
        }
       
protected override void RenderContents (HtmlTextWriter
                                                controlOutput
) {
          
controlOutput.Write (_date.ToString(dd.MM.yyyy HH:ss));
        }
     }
  }

Также с помощью атрибута Themeable можно контролировать доступность подобной настройки для конкретного свойства:

namespace MyOwn.ServerControls {
    
public class SimpleDate : WebControl {
       
private DateTime _date;
        [
Themeable(false)]
       
public DateTime Date {
          
set {_date =value;}
        }
     }
  }

[HMTL]<h3>Заключение</h3>[/HTML]

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



Похожие статьи:
- Сложные графики и диаграммы в ASP.NET. Часть третья - HttpHandler/System.Drawing
- Категориальное упорядочение результатов запроса
- Средства безопасности ASP.NET. Аутентификация
- XML+MSSQL+ASP.NET. Часть 1.
- Концептуальный подход к дизайну сайта
- Разница между HttpModule и HttpHandler
- Очищаем HTML от лишних знаков
- Обзор DetailsView
- Лекция 6. Работа с базами данных.
- Лекция 2. Анатомия ASP.NET. ASP.NET в действии.
- Рекомендации по продвижению малых сайтов
- Использование AJAX в ASP.NET
- Полезные советы для работы с XML


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.003]