Сценарий Попытаемся создать в компании Adventure Works индивидуальный шаблон оформления для этого портала




Скачать 322.65 Kb.
НазваниеСценарий Попытаемся создать в компании Adventure Works индивидуальный шаблон оформления для этого портала
страница1/3
Дата публикации08.11.2013
Размер322.65 Kb.
ТипСценарий
uchebilka.ru > Информатика > Сценарий
  1   2   3

Лабораторная работа №7

Персонализация приложений с помощью пользовательских профилей и тем

1. Цель работы


Целью работы является теоретическое ознакомление с персонализацией страниц, приобретение практических навыков в подключении профилей пользователей с использованием API персонализации платформы ASP.NET 2.0, а также в применении темы оформления ASP.NET 2.0 для модификации внешнего вида Web-сайта

2. Состав рабочего места


2.1. Оборудование: IBM-совместимый персональный компьютер (ПК).

2.2. Программное обеспечение: операционная система Windows, интегрированная оболочка Visual Studio. Провайдер персонализации SQL Server при поддержке ASP.NET 2.0.

Сценарий

Попытаемся создать в компании Adventure Works индивидуальный шаблон оформления для этого портала.

Сперва необходимо добавить несколько Web Parts на домашнюю страницу, которые дадут возможность пользователям находить других работников организации.

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

Требования:

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

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

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

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


Решение:

Для решения поставленных задач будем использовать темы оформления.

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


^

3. Краткие теоретические сведения

Персонализация страниц


Широкие возможности персонализации требуются далеко не каждому приложению ASP.NET. Включив в состав приложения персонализационный слой, вы можете сделать его страницы более дружественными пользователю, удобными и привлекательными. Для одних приложений персонализация — всего лишь дополнительное удобство, без которого вполне можно было бы обойтись, тогда как для других, таких как порталы и электронные торговые центры, это ключевая функция, без которой они не могут функционировать должным образом. ASP.NET 2.0 поддерживает две взаимодополняющие формы персонализации: пользовательские профили и темы.

Подсистема пользовательских профилей обеспечивает возможность постоянного хранения структурированных данных, а для доступа к ней используется типизированный дружественный программисту API. Приложение определяет собственную модель персонализированных данных, и исполняющая среда ASP.NET делает остальное, выполняя синтаксический разбор определения этой модели и компилируя результирующий класс. Каждая переменная-член персонализационного класса соответствует элементу информации, связанной с конкретным пользователем. Загрузка и сохранение персонализированных данных выполняются прозрачно для конечного пользователя и не требуют от автора страницы глубокого знания внутренней архитектуры подсистемы персонализации.

Тема определяет настраиваемый набор стилей и визуальных атрибутов, назначаемых элементам сайта. К числу таких элементов относятся таблицы стилей страниц, изображения, шаблоны, а также свойства элементов управления. Тема объединяет все визуальные стили всех настраиваемых элементов страницы, так что ее можно назвать чем-то вроде супер-CSS. Мы подробно рассмотрим вопрос о темах далее.
^

Создание пользовательского профиля



На высшем уровне абстракции пользовательский профиль — это набор свойств, которые исполняющая среда ASP.NET 2.0 сгруппировала в динамически сгенерированный класс. Данные профиля сохраняются в постоянной памяти для каждого пользователя в отдельности и хранятся там до тех пор, пока не будут удалены кем-либо, имеющим административные привилегии. При выполнении страницы ASP.NET динамически создает объект профиля, содержащий типизированные свойства, определенные вами в модели данных. Этот объект добавляется затем в текущий объект HttpContext и делается доступным страницам через свойство Profile.

Место хранения данных профиля скрыто от пользователя и даже, до некоторой степени, от программиста. Пользователю просто ни к чему знать, как и где хранятся эти данные, а программисту обычно достаточно указать тип провайдера профилей, который он желает использовать. Каждый провайдер использует свое хранилище данных; встроенные провайдеры хранят их в базе данных Microsoft SQL Server, а пользовательские могут использовать и другие хранилища.
^

Определение модели данных


Для того чтобы воспользоваться API профилей ASP.NET 2.0, нужно первым делом решить, какая структура данных профиля требуется вашему приложению. Эту модель данных вы описываете в файле web.config в формате XML, определяя свойства и со­ответствующие им типы .NET Framework.

Каждое свойство задается в виде пары имя-значение в подразделе
раздела
конфигурационного файла. Раздел
,
содержащий также информацию о провайдере, в свою очередь, является подразделом . При­ведем пример определения пользовательского профиля, состоящего из двух строковых свойств, BackColor и ForeColor.











Все свойства, определенные с использованием тэга , являются членами объек­та динамически созданного класса, доступного как часть HTTP-контекста страницы. В атрибуте type задается тип свойства. Если он не задан, по умолчанию свойству назначается тип System.String. Допускается использование любого типа данных, под­держиваемого общеязыковой средой. В таблице ниже перечислены допустимые атрибуты элемента . Обязательным является только атрибут name.








Атрибут

Описание

allowAnonymous

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

defaultValue

Значение свойства по умолчанию

customProviderData

Данные для пользовательского провайдера профилей

name

Имя свойства

provider

Имя провайдера, используемого для чтения и записи значения свой­ства

readOnly

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

serializeAs

Указывает, как следует сериализовать значение свойства. Допустимыми установками являются Xml, Binary, String и ProviderSpecific

type

Тип свойства, определенный в .NET Framework. По умолчанию string

Табл.1.Описание атрибутов элемента
Разработчику приложения вовсе не обязательно знать, как осуществляется запись информации в хранилище персонализационных данных и как она оттуда считывается. Однако само это хранилище разработчику необходимо создать и сконфигурировать. Далее мы подробно обсудим этот вопрос. А пока взгляните на фрагмент кода, который позво­лит вам составить представление о генерируемом ASP.NET классе ProfileCommon, который реализует модель данных профиля:

namespace ASP

{

public class ProfileCommon : ProfileBase

{

public virtual string BackColor

{

get {(string) GetPropertyValue("BackColor");}

set {SetPropertyValue("BackColor", value);}

}

public virtual string ForeColor

{

get {(string) GetPropertyValue("ForeColor");}

set {SetPropertyValue("ForeColor", value);}

}

public virtual ProfileCommon GetProfile(string username)

{

object о = ProfileBase.Create(username);

return (ProfileCommon) o;

}

}

}

Экземпляр этого класса связывается со свойством Profile класса страницы, а до­ступ к нему осуществляется следующим образом:

// Использование свойства BackColor для установки цвета фона страницы theBody.Attributes["bgcolor"] = Profile.BackColor;
Несмотря на то, что ASP.NET 2.0 поддерживает и профили анонимных пользова­телей, между учетными записями пользователей и информацией их профилей суще­ствует тесная взаимосвязь. Мы еще поговорим об этом подробнее, а пока можно лишь обратить ваше внимание на данный факт.
^

Использование коллекций


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



type="System.Collections.Specialized.StringCollection" />




Чтобы в хранилище можно было записывать значения, не являющиеся скалярны­ми, такие как коллекции или массивы, их необходимо сериализировать. Способ сериализации задается с помощью атрибута serialize As, принимающего значения String, Xml, Binary и ProviderSpecific. Если атрибут serializeAs не задан, используется установка String. Как правило, сериализация коллекций осуществляется путем их преобразова­ния в двоичный формат или в формат XML.
^

Пользовательские типы данных


Свойство пользовательского профиля не обязательно должно относиться к одному из встроенных типов данных — тип может быть и пользовательским, нужно только указать, как должна осуществляться его сериализация. Реализуя пользовательский тип, вы пишете класс и компилируете его, после чего добавляете имя полученной сборки к информации о типе свойства профиля:




type="My.Namespace.DataContainer, MyAssembly" serializeAs="Binary" />


Чтобы сборка, содержащая пользовательский тип, была доступна приложению ASP.NET, ее следует поместить в папку Bin этого приложения или зарегистрировать в глобальном кэше сборок (GAC).
^

Работа с пользовательским профилем


Включение и отключение функции поддержки профилей осуществляется с помощью атрибута enabled раздела
файла web.config. Если этот атрибут имеет значение true (а таковым оно является по умолчанию), функция персонализации включена для всех страниц. Когда данная функция отключена, страницы не имеют свойства Profile.
^

Создание базы данных пользовательских профилей


Итак, вы уже знаете, что каждый профиль содержит персонализационные данные, связанные с одним конкретным пользователем, и сохраняется в постоянной памяти. Присвоив атрибуту enabled конфигурационного раздела
значение true, вы активизируете подсистему поддержки пользовательских профилей, но прежде чем ее можно будет использовать, необходимо выполнить еще одну задачу — создать инфраструктуру хранения данных.

Это можно сделать с помощью административного средства Web Site Administration Tool (WSAT), входящего в состав ASP.NET 2.0 и полностью интегрированного в Visual Studio. Напомню, что оно вызывается командой WebsiteASPNET Configuration.

С помощью данного средства вы можете создать базу данных SQL Server 2005, используемую по умолчанию для хранения данных профилей, — ее файл, aspnetdb.mdf, должен находиться в папке AppData приложения. Схема этой базы данных (в том числе набор и структура таблиц) фиксирована. Здесь же содержатся таблицы, предназначенные для хранения информации о членстве и ролях. Указанная информация необходима, в частности, и подсистеме персонализации, поскольку данные пользовательских профилей по определению связаны с пользователями. Идентификаторы пользователей (будь то идентификаторы учетных записей Windows или учетных записей, поддерживаемых конкретным приложением) используются для индексирования данных их профилей.

Пользовательские профили не имеют срока давности и хранятся «вечно», то есть до тех пор, пока администратор Web-сайта не удалит их по каким-нибудь соображениям.

Разумеется, WSAT — не единственное средство, с помощью которого можно сформировать инфраструктуру для хранения данных профилей. Например, если вашему приложению необходим пользовательский провайдер персонализации, то подготовку этой инфраструктуры (будь то таблица SQL Server, база данных Oracle или иное хранилище) должна осуществлять программа его инсталляции. Об установке и конфигурировании провайдеров профилей речь пойдет в следующем разделе.
^

Работа с анонимными пользователями


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



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

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




type="System.D rawi ng.Colo r" allowAnonymous="true" />


type="System.Collections.Specialized.StringCollection" serializeAs="Xml" />






^

Доступ к свойствам профиля


Перед началом цикла обработки запроса свойству Profile страницы присваивается экземпляр динамически созданного класса, представляющего определенный в файле web.config пользовательский профиль. При первой загрузке страницы свойства профиля получают значения по умолчанию (если таковые имеются) или инициализируются пустыми объектами, но эти свойства никогда не бывают равными null. Если свойство имеет пользовательский тип или является коллекцией, как свойство Links в приведенном выше примере, декларативно задать для него значение по умолчанию вы не можете. (Тем не менее во время выполнения свойство Links будет равным не null, а пустой коллекции). А как задать значение свойства программным способом?

Свойства, для которых значения по умолчанию не заданы декларативно, можно инициализировать в обработчике события Page_Load (разумеется, сначала убедившись, что страница не обрабатывает возврат формы):

if (!IsPostBack)

{

// Включаем в состав коллекции Links несколько предопределенных ссылок

if (Profile.Links.Count == 0)

{

Profile.Links.Add("http://www.contoso.com");

Profile.Links.Add("http://www.northwind.com");

}

}

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

Структура пользовательского профиля, используемого кодом этой страницы, описывается следующей XML-разметкой:







type="System.Collections.Specialized.StringCollection"/>







group>


>

profile>




Рис.1. Пример страницы



Благодаря поддержке профилей одна и та же страница у разных пользователей выглядит по-разному.

Данные этого профиля используются для адаптации пользовательского интерфейса страницы:

private void ApplyPagePersonalization()

{

// Устанавливаем цвета панели

InfoPanel.ForeColor = ColorTranslator.FromHtml(Profile.ForeColor); InfoPanel.BackColor = ColorTranslator.FromHtml(Profile.BackColor);

// Устанавливаем шрифт панели

InfoPanel.Font.Name = Profile.Font.Name;

InfoPanel.Font.Size = FontUnit.Point(Profile.Font.SizeInPoints);

// Создаем ссылки

Favorites.Controls.Clear(),

if(Profile.Links.Count == 0)

Favorites.Controls.Add(new LiteralControl("No links available."));

else

foreach (object о in Profile.Links)

{

HyperLink h = new HyperLink ();

h.Text = o.ToString ();

h.NavigateUrl = o.ToString ();

Favorites.Cont rols.Add(h);

Favorites.Controls.Add(new LiteralControl("
"));

}

}
Метод ApplyPagePersonalization вызывается из обработчика события Page_Load:

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

// Инициализируем необходимым образом свойства профилей

}

ApplyPagePersonalization();

}
Инициализация — важный этап жизненного цикла страницы, но происходящее на этом этапе всецело определяется нуждами конкретного приложения. В нашем примере при первом обращении пользователя к странице цвета не задаются и гиперссылки не определяются. Так как мы перебираем элементы коллекции в цикле, пустая коллекция вполне подходит и никакая иная инициализация для нее не требуется. (Заметьте, что .NET Framework обеспечивает создание экземпляров всех объектов, на которые в программе имеются ссылки) А как насчет цветовых свойств? Если значение по умолчанию задано в файле web.config, исполняющая среда использует его для инициализации соответствующего свойства при первом обращении пользователя к странице; иначе необходимо позаботиться об установке свойства в обработчике события Page_Load.

Когда обработка запроса завершается, содержимое объекта профиля сохраняется в постоянной памяти и извлекается при следующем вызове страницы. Тогда уже все свойства будут инициализированы, если только администратор сайта не удалит какие-либо данные.

Заметьте, что если пользователю позволено настраивать внешний вид и поведение страницы, ему должен быть предоставлен для этой цели удобный интерфейс. Например, в состав страницы, показанной на рис. 1, входит элемент управления MultiView, с помощью которого при щелчке пользователем ссылки Click here to edit или Close происходит переключение между основным режимом использования страницы и режимом редактирования ее настроек.

ProfileModule подключается к двум событиям HTTP и вызывается дважды: после авторизации запроса и перед завершением его выполнения. Если функция персонализации отклю­чена, данный модуль немедленно возвращает управление исполняющей среде; в про­тивном случае он генерирует для приложения событие Personalize, а затем загружает персонализационные данные из профиля текущего пользователя. Когда генерируется событие Personalize, эти данные еще не загружены. Обработчик указанного события должен содержаться в файле global.asax:

void Profile_Personalize(object sender, ProfileEventArgs e)

{

ProfileCommon profile = null;

// Если пользователь анонимный - выход

if (User == null) return;

// Определяем профиль с учётом роли пользователя. База данных

// профилей содержит по одной записи для каждой роли

if (User.IsInRole("Administrators"))

profile = (ProfileCommon) ProfileBase.Create("Administrator"); else if (User.IsInRole("Users"))

profile = (ProfileCommon) ProfileBase.CreateC'User");

else if (User.IsInRole("Guests"))

profile = (ProfileCommon) ProfileBase.Create("Guest");

// Делаем так, чтобы HTTP-модуль поддержки профилей

// использовал объект профиля THIS

if (profile != null) e.Profile = profile;

}

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

Слой персонализации использует идентификатор текущего пользователя в качестве ключа для извлечения необходимого набора данных. А как насчет ролей? Что если у вашего приложения сотни пользователей с различными именами и все они используют всего две-три разные группы установок, в зависимости от роли, исполняемой каждым из пользователей? Имеет ли смысл хранить в базе данных сотни почти идентичных записей? Конечно, лучше было бы сохранять наборы установок для ролей, но стандартная подсистема пользовательских профилей не имеет о ролях ни малейшего представления. Вот почему иногда возникает необходимость в обработке события Personalize или написании собственного провайдера профиля.

В приведенном выше коде процесс создания объекта пользовательского профиля переопределен так, чтобы этот объект создавался с учетом роли пользователя, а не его имени. Статический метод Create класса ProfileBase принимает имя пользователя и создает соответствующий экземпляр объекта профиля. ProfileCommon — имя динамически создаваемого класса, представляющего пользовательский профиль.

Обработчик события Personalize получает данные профиля посредством класса ProfileEventArgs, у которого имеется доступное для чтения и записи свойство с именем Profile. Когда выполнение этого обработчика завершается, модуль HTTP, реализующий функцию поддержки профилей, проверяет содержимое свойства Profile. Если его значением является null, модуль продолжает свою работу обычным образом и создает объект профиля, основываясь на идентификаторе пользователя. В противном случае модуль просто передает странице в качестве объекта профиля текущее значение свойства Profile.
^

Перенос данных анонимных пользователей


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

Когда к приложению подключается зарегистрированный пользователь, модуль персонализации генерирует событие MigrateAnonymous, в обработчике которого можно перенести в его профиль установки, заданные им ранее анонимно. Делается это так:

void Profile_MigrateAnonymous(object sender, ProfileMigrateEventArgs e)

{

// Загрузка профиля анонимного пользователя

ProfileCommon anonProfile;

anonProfile = Profile.GetProfile(e.AnonymousId);

// Перенос свойств в новый профиль

Profile.BackColor = anonProfile.BackColor;

}

Вы получаете профиль анонимного пользователя, извлекаете значения его свойств и копируете их в профиль зарегистрированного пользователя.
^

Провайдеры профилей


В ASP.NET 2.0 API профилей состоит из двух независимых компонентов: слоя доступа и слоя хранения.

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

Слой хранения с помощью специализированных провайдеров выполняет операции, связанные с сохранением и восстановлением значений. В состав ASP.NET 2.0 входит провайдер профилей, в качестве СУБД использующий MS SQL Server. Он записывает данные в выбранное хранилище и отвечает за то, какой будет конечная схема этих данных. Провайдер должен быть способен либо сериализовать объект данных (превратив его, например, в текст XML-формата или двоичный объект), либо уметь извлечь из него требуемую информацию. При необходимости провайдер профилей можно написать самостоятельно.
^

Конфигурирование провайдеров профилей


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

Стандартный провайдер профилей ASP.NET 2.0 носит имя AspNetSqlProfileProvider. Для хранения информации он использует базу данных MS SQL Server. Вот запись о его регистрации в подразделе
раздела
конфигурационного файла machine.config:


connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider" />







Каждому зарегистрированному провайдеру соответствует свой узел раздела
.
Атрибуты name и type задаются для всех провайдеров, набор остальных атрибутов зависит от типа конкретного провайдера. При желании в атрибуте description можно задать текстовое описание провайдера.

Атрибут connectionStringName служит для определения строки подключения к базе данных пользовательских профилей. Он содержит не строку подключения, а ее имя — сама же строка зарегистрирована в другом месте конфигурационного файла. Например, очевидно, что LocalSqlServer — это не строка подключения к удаленному или локальному экземпляру SQL Server. Элемент с таким именем вы найдете в разделе , введенном в ASP.NET 2.0 для того, чтобы все строки подключения можно было хранить централизованно (этот раздел также находится в файле machine.config):







Как видите, данная строка подключения содержит ссылку на экземпляр SQL Server с именем SQLEXPRESS и служит для подключения к базе данных aspnetdb.mdf, хранящейся в разделе данных приложения — папке App_Data.
^

Пользовательские провайдеры профилей


Для разработки новых приложений вполне подходит встроенный провайдер профилей. Однако в случае, если вы переносите на платформу ASP.NET 2.0 старое приложение ASP или ASP.NET, данные которого хранятся в нереляционной форме или в СУБД, отличной от SQL Server, этот провайдер вам не подойдет, и придется написать собственный провайдер профилей.

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






  1   2   3

Добавить документ в свой блог или на сайт

Похожие:

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

Сценарий Попытаемся создать в компании Adventure Works индивидуальный шаблон оформления для этого портала iconПлан счетов 4 Отчеты и обработки 4
С: Предприятие используются в основном для выдачи информации, хранящейся в Справочниках, Регистрах или Документах. В конфигураторе...

Сценарий Попытаемся создать в компании Adventure Works индивидуальный шаблон оформления для этого портала icon20 грн Написание новости компании, 1 шт
Вся информация размещается на представительстве компании на Укрбизнесе и в соответствующем разделе портала, чем обеспечивается максимальное...

Сценарий Попытаемся создать в компании Adventure Works индивидуальный шаблон оформления для этого портала iconОблава на зайца
Файл/Создать/Документ Microsoft Word. Назвать новый документ Курсовая работа. Открыть этот документ. Создать две пустых страницы...

Сценарий Попытаемся создать в компании Adventure Works индивидуальный шаблон оформления для этого портала iconПредлагаемый шаблон договора может быть использован для оформления...
Договорные отношения в связи с оказанием услуг урегулированы Главой 63 Гражданского кодекса Украины

Сценарий Попытаемся создать в компании Adventure Works индивидуальный шаблон оформления для этого портала iconCx-x (номер доклада в тезисах, строку не трогать!!!) Шаблон для оформления...
Сборник тезисов докладов конференции будет состоять из тезисов на русском языке объемом не более одной страницы

Сценарий Попытаемся создать в компании Adventure Works индивидуальный шаблон оформления для этого портала iconЭкспедиторам Инструкция о порядке оформления распорядительных документов...
Наряд (как распорядительный документ экспедиторской компании) должен соответствовать форме «Единого Наряда» без дополнений и изъятий,...

Сценарий Попытаемся создать в компании Adventure Works индивидуальный шаблон оформления для этого портала iconТехническое задание для проведения озп выбор поставщика услуг для...
Компания умс объявляет озп на выбор поставщика услуг для поддержки нового брендированного wap-портала. В ходе процедуры проводится...

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

Сценарий Попытаемся создать в компании Adventure Works индивидуальный шаблон оформления для этого портала iconАдрес (фактический/для писем)* Адрес официального сайта/портала компании*
Проживание в «Happy Hotel» г. Ялта с 27. 02. 2013 (заезд с 08: 00) по 01. 03. 2013 г. (выезд до 12: 00)

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
uchebilka.ru
Главная страница


<