Термин .
В
Браузер обычно выдает новый запрос при отправке формы HTML, инициированной либо сценарием, работающим на стороне клиента, либо действием пользователя (скажем, щелчком на кнопке). Получив ответ, браузер заменяет старую страницу новой.
Основным фактором, заложенным в основу удаленного исполнения сценариев, является возможность выдачи внеполосных запросов HTTP. В данном контексте под внеполосным вызовом понимается запрос HTTP, который выдается за пределами встроенного модуля, обеспечивающего отправку форм HTTP Внеполосный вызов инициируется событием страницы HTML и обслуживается компонентом-посредником (proxy component). В новейших ; в самых первых реализациях RS им был апплет Java
Данная технология построена на принципе выполнения запроса к серверу с использованием JavaScript и получению результата опять же, с помощью JavaScript, что позволяет избежать перегрузки страницы и следовательно имеет несколько неоспоримых преимуществ:
Спецификация DOM (
Следует заметить, что хотя первые работоспособные прикладные среды удаленного исполнения сценариев появились около десяти лет назад, ограниченная поддержка динамического изменения отображаемого документа в браузере тормозила массовое принятие таких технологий в масштабах отрасли. До сегодняшнего дня.
Объект впервые появился в Internet Explorer 5.0. Этот внутренний объект публикуется браузером для работы с его подсистемой исполнения сценариев. Сценарный код, входящий в клиентскую страницу (как правило, код JavaScript), обращается к объекту и использует его функциональность.
Что касается функциональности (несмотря на префикс XML),объект представляет собой компактную объектную модель для отправки сценарием обращений HTTP в обход браузера. Когда пользователь щелкает на кнопке отправки формы или выполняет любое действие, приводящее к вызову метода submit объекта form модели DOM, браузер вмешивается в происходящее и берет последующую отправку запроса HTTP под свой полный контроль. С точки зрения пользователя, отправка запроса работает по принципу "черного ящика" с единственным видимым результатом: на экране появляется новая страница. Клиентский код сценария не может управлять процессом размещения и результатом отправки запроса.
Объект дает возможность сценарному коду отправлять запросы HTTP и обрабатывать полученные ответы.
Важно заметить, что этот объект не является стандартом W3C, хотя многое из его функциональности описано в спецификации "The DOM Level 3 Load and Save Specification". По этой причине его поведение может немного отличаться в различных браузерах. Но во всех браузерах он выполняет одну и ту же функциональность – он умеет посылать запросы к серверу и получать от него ответы. Как уже говорилось выше, данный объект не стандартизирован и создание его instance может отличаться в различных версиях, поэтому для "надежного" его создания лучше использовать код, который объединяет в себе создание instance в нескольких браузерах подобно коду ниже:
var xmlHttp;
function createXMLHttpRequest()
{
if (window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}
}
имеет ряд "стандартных" (стандартных в кавычках т.к. как писалось выше, данный объект не стандартизирован для всех браузеров) свойств и методов, которые позволяют данному объекту посылать запрос, проверять состояние запроса и получать результат выполнения запроса от удаленного сервера. Эти свойства и методы мы рассмотрим в следующих двух таблицах.
В таблице 1 представлены "стандартные" свойства
| Метод | Описание |
|---|---|
|
Прерывает текущий запрос |
getAllResponseHeaders() |
Возвращает все заголовки Response в виде ключ/значение |
getResponseHeader(header) |
Возвращает значение определенного заголовка |
open(method, url, |
Устанавливает состояние запроса к серверу. Первый параметр указывает метод запроса – PUT, GET, POST, второй – url запроса, третий (необязательный) – тип запроса (синхронный или асинхронный), четвертый и пятый (также необязательные) – для защищенных страниц |
send(content) |
Посылает запрос серверу |
setRequestHeader(header, value) |
Устанавливает значение определенного заголовка. Перед вызовом этого метода необходимо вызвать метод open |
Также содержит ряд свойств, которые представлены ниже:
| Свойство | Описание |
|---|---|
onreadystatechange |
Обработчик события, которое возникает при каждой смене состояния запроса |
readyState |
Состояние запроса. Доступны следующие значения: 0 – запрос неинициализирован, 1 – загрузка, 2 – загрузка окончена, 3 – interactive, 4 - complete |
responseText |
Ответ от сервера в виде строки |
responseXML |
Ответ от сервера в XML. Этот объект может быть обработан и проверен как DOM |
status |
Код статуса HTML.(например 200 – OK) |
statusText |
Название кода статуса HTML |
Бегло проглянув эти методы, несложно понять, какие методы достаточно вызвать, чтобы с помощью JavaScript получить какие-либо данные с сервера.
Для веб-страницы, выдающей внеполосные вызовы, определяется одно или несколько триггерных событий, которые в результате обработки кодом JavaScript выдают запросы через объект .
Код JavaScript должен инициировать обращение к удаленному URL и управлять им, как показано в следующем фрагменте:
<script type="text/javascript">
function SendRequest(url, params) " {
// Включение параметров в строку запроса
var pageUrl - url + "?outofband-trueparam" + params;
/' Инициализация объекта XmlHttpRequest
var xmlRequest, e;
try {
xml Request = new XMLHttpRequest();
catch(e) { try {
xmlRequest = new ActiveXObject('Microsoft.XMLHTTP");
}
catch(e) { }
}
// Подготовка к отправке синхронного запроса
POST xmlRequest,ореп("POST". pageUrl. false);
xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlRequest.send(nul1);
return xmlRequest;
}
</script>
Функция в приведенном примере получает две строки — вызываемый URL и список параметров. Формат строки запроса никак не стандартизирован и может произвольно изменяться в каждой конкретной реализации.
В нашем примере URL, заданный программистом, дополняется парой параметров. Первый параметр ( outof в нашем примере) представляет собой логический флаг, который указывает, должен ли запрос обрабатываться пользовательской param в нашем примере) передаются входные параметры для кода, исполняемого на стороне сервера.
Код страницы выглядит примерно так:
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Testing Out-of-band</title>
</head>
<body>
<form id="Forml" runat="server">
<hl>Demonstrate Out-of-band Calls</hl>
<h2>%=Request.Url%></h2>
<hr />
<asp:DropDownList runat="server" ID="EmployeeList" />
<input id="Button1" type="button"
value="Go Get Data" onclick="MoreInfo()" />
<hr />
<span id="Msg" />
</form>
</body>
</html>
Класс программной логики ( code-behind class ) приведен в следующем листинге:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsOutOfBan())
return;
if (!IsPostBack)
PopulateList();
}
private bool IsOutOfBand()
{
if (Request.QueryString["outofband"] != null)
{
String param = Request.QueryString["param"].ToString();
Response.Write(ExecutePageMethod(param));
Response.Flush();
Response. End();
return true:
}
return false;
}
private void PopulateList()
{
SqlDataAdapter adapter = new SqlDataAdapter(
"SELECT employeeid, lastname FROM employees",
"SERVER=(1ocal); DATABASE=northwind; UID=...;");
DataTable table = new DataTable();
adapter.Fill(table);
EmployeeList.DataTextField = "lastname";
EmployeeList.DataValueField = "employeeid";
EmployeeList.DataSource = table;
EmployeeList.DataBind();
}
string ExecutePageMethod(string eventArgument) {
return "You clicked: " + eventArgument;
}
}
Внеполосный вызов ASP.NET начинается с выполнения функции JavaScript, предоставленной системой. Как правило, эта функция связывается с обработчиком события уровня страницы — такого, как щелчок на кнопке или изменение выбранной строки в раскрывающемся списке. Для наглядности рассмотрим конкретный пример.
Представьте веб-страницу, на которой отображается информация о работнике. Пользователь выбирает имя из списка и щелкает на кнопке, чтобы получить дополнительную информацию. Чтобы механизм внеполосного вызова успешно работал, кнопка не должна быть кнопкой отправки ( submit button ); в противном случае произойдет обычная отправка данных с полным обновлением страницы. Возьмем следующую разметку:
<asp:DropDownList ID="cboEmployees" runat="server"
DataTextField="lastname" DataValueFiel="employeeid" />
<input type="button" runat="server"
id="buttonTrigger" value="More Info">

Пользователь выбирает элемент из списка и щелкает на кнопке, чтобы получить дополнительную информацию. Обработчик события onclick кнопки добавляется динамически при обработке страницы на сервере. Такие вещи уместно делать при обработке события Page_Load:
protected void Page_Load (object sender, EventArgs e)
{
if (!IsPostBack)
{
// Заполнение списка
cboEmployees.DataSource = GetEmployeeList();
cboEmployees.DataBind();
// Построить средствами ASP.NET строку с функцией Javascript,
// вызываемой для инициирования внеполосного вызова
string rpc = ClientScript.GetCallbackEventReference(
this,
"document.forms[0].elements['cboEmployees'].value",
"UpdatePage",
"null",
"null",
false);
// Инициирование внеполосного вызова кнопкой
string js - String.Format("javascript:{0}". rpc):
buttonTrigger.Attributes["onclick"] = js:
}
}
private Collection<Employee> GetEmployeeList()
{
...
}
ASP.NET Script . Вместо этого следует направить все внимание на программный интерфейс метода GetCallbackEventReference объекта Page.ClientScript. Метод получает параметры, используемые при вызове, и возвращает строку с исходным кодом JavaScript, предназначенную для внедрения в страницу. Когда страница передается пользователю, кнопка, инициирующая внеполосный вызов, связывается со следующим сценарием:
<input name="buttonTrigger" type="button"
id="button1" value="More Info"
onclick="javascript:WebForm_DoCallback('__Page",
document.forms[0].elements['cboEmployees'].value,
UpdatePage,null, null, false)" />
сценарий хранится в ресурсах сборки и связывается со страницей при помощи динамически сгенерированной директивы включения сценария:
<script src="/ProAspNetAdv/WebResource.axd?d=...t=..." type="text/javascript"></script>
В странице, предоставленной пользователю, этот элемент располагается непосредственно за открывающим тегом .Не стоит и говорить, что вызывает объект и управляет запросом HTTP.
Возможности
Приложения с поддержкой
Архитектура возможностей
(рис 9.1) Клиентская и серверная архитектуры ASP.NET AJAX Иллюстрация демонстрирует функциональность клиентской Microsoft
Клиентская архитектура включает библиотеки для поддержки компонентов, совместимость с обозревателями, сетевые средства и базовые службы
С помощью клиентских компонентов реализуется обогащенный пользовательский интерфейс в обозревателе без операций обратной передачи. Компоненты делятся на три категории:
Тип используемого компонента зависит от требуемого типа клиентского поведения. Например, водяной знак в существующем текстовом поле можно создать, используя поведение, связанное с текстовым полем.
Библиотеки клиентских сценариев
Серверные составляющие, поддерживающие разработку с использованием технологии
Возможности
Можно также создавать пользовательские клиентские сценарии для приложений ASP.NET. В таком случае можно использовать возможности
Возможности ASP.NET
Благодаря поддержке сценариев
Функциональность
Можно также осуществлять доступ к веб-службам ASP.NET с использованием серверных элементов управления ASP.NET
Ниже приведен список наиболее часто используемых серверных элементов управления ASP.NET
ScriptManagerУправляет ресурсами сценариев для клиентских компонентов, частичной отрисовки страниц, локализации, глобализации и пользовательских сценариев. Элемент управления ScriptManager необходим для использования элементов управления UpdatePanel, UpdateProgress и Timer.
UpdatePanelПозволяет обновлять отдельные части страницы вместо обновления ее целиком, осуществляемого путем использования синхронной обратной передачи.
UpdateProgressПредоставляет информацию о состоянии касательно частичного обновления страницы в элементах управления UpdatePanel.
TimerВыполняет операции обратной передачи с заданной периодичностью. Элемент управления Timer можно использовать для периодического обновления всей страницы или же ее части; в последнем случае он используется совместно с элементом управления UpdatePanel.
Термин .
В
Браузер обычно выдает новый запрос при отправке формы HTML, инициированной либо сценарием, работающим на стороне клиента, либо действием пользователя (скажем, щелчком на кнопке). Получив ответ, браузер заменяет старую страницу новой.
Основным фактором, заложенным в основу удаленного исполнения сценариев, является возможность выдачи внеполосных запросов HTTP. В данном контексте под внеполосным вызовом понимается запрос HTTP, который выдается за пределами встроенного модуля, обеспечивающего отправку форм HTTP Внеполосный вызов инициируется событием страницы HTML и обслуживается компонентом-посредником (proxy component). В новейших ; в самых первых реализациях RS им был апплет Java
Данная технология построена на принципе выполнения запроса к серверу с использованием JavaScript и получению результата опять же, с помощью JavaScript, что позволяет избежать перегрузки страницы и следовательно имеет несколько неоспоримых преимуществ:
Спецификация DOM (
Следует заметить, что хотя первые работоспособные прикладные среды удаленного исполнения сценариев появились около десяти лет назад, ограниченная поддержка динамического изменения отображаемого документа в браузере тормозила массовое принятие таких технологий в масштабах отрасли. До сегодняшнего дня.
Объект впервые появился в Internet Explorer 5.0. Этот внутренний объект публикуется браузером для работы с его подсистемой исполнения сценариев. Сценарный код, входящий в клиентскую страницу (как правило, код JavaScript), обращается к объекту и использует его функциональность.
Что касается функциональности (несмотря на префикс XML),объект представляет собой компактную объектную модель для отправки сценарием обращений HTTP в обход браузера. Когда пользователь щелкает на кнопке отправки формы или выполняет любое действие, приводящее к вызову метода submit объекта form модели DOM, браузер вмешивается в происходящее и берет последующую отправку запроса HTTP под свой полный контроль. С точки зрения пользователя, отправка запроса работает по принципу "черного ящика" с единственным видимым результатом: на экране появляется новая страница. Клиентский код сценария не может управлять процессом размещения и результатом отправки запроса.
Объект дает возможность сценарному коду отправлять запросы HTTP и обрабатывать полученные ответы.
Важно заметить, что этот объект не является стандартом W3C, хотя многое из его функциональности описано в спецификации "The DOM Level 3 Load and Save Specification". По этой причине его поведение может немного отличаться в различных браузерах. Но во всех браузерах он выполняет одну и ту же функциональность – он умеет посылать запросы к серверу и получать от него ответы. Как уже говорилось выше, данный объект не стандартизирован и создание его instance может отличаться в различных версиях, поэтому для "надежного" его создания лучше использовать код, который объединяет в себе создание instance в нескольких браузерах подобно коду ниже:
var xmlHttp;
function createXMLHttpRequest()
{
if (window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}
}
имеет ряд "стандартных" (стандартных в кавычках т.к. как писалось выше, данный объект не стандартизирован для всех браузеров) свойств и методов, которые позволяют данному объекту посылать запрос, проверять состояние запроса и получать результат выполнения запроса от удаленного сервера. Эти свойства и методы мы рассмотрим в следующих двух таблицах.
В таблице 1 представлены "стандартные" свойства
| Метод | Описание |
|---|---|
|
Прерывает текущий запрос |
getAllResponseHeaders() |
Возвращает все заголовки Response в виде ключ/значение |
getResponseHeader(header) |
Возвращает значение определенного заголовка |
open(method, url, |
Устанавливает состояние запроса к серверу. Первый параметр указывает метод запроса – PUT, GET, POST, второй – url запроса, третий (необязательный) – тип запроса (синхронный или асинхронный), четвертый и пятый (также необязательные) – для защищенных страниц |
send(content) |
Посылает запрос серверу |
setRequestHeader(header, value) |
Устанавливает значение определенного заголовка. Перед вызовом этого метода необходимо вызвать метод open |
Также содержит ряд свойств, которые представлены ниже:
| Свойство | Описание |
|---|---|
onreadystatechange |
Обработчик события, которое возникает при каждой смене состояния запроса |
readyState |
Состояние запроса. Доступны следующие значения: 0 – запрос неинициализирован, 1 – загрузка, 2 – загрузка окончена, 3 – interactive, 4 - complete |
responseText |
Ответ от сервера в виде строки |
responseXML |
Ответ от сервера в XML. Этот объект может быть обработан и проверен как DOM |
status |
Код статуса HTML.(например 200 – OK) |
statusText |
Название кода статуса HTML |
Бегло проглянув эти методы, несложно понять, какие методы достаточно вызвать, чтобы с помощью JavaScript получить какие-либо данные с сервера.
Для веб-страницы, выдающей внеполосные вызовы, определяется одно или несколько триггерных событий, которые в результате обработки кодом JavaScript выдают запросы через объект .
Код JavaScript должен инициировать обращение к удаленному URL и управлять им, как показано в следующем фрагменте:
<script type="text/javascript">
function SendRequest(url, params) " {
// Включение параметров в строку запроса
var pageUrl - url + "?outofband-trueparam" + params;
/' Инициализация объекта XmlHttpRequest
var xmlRequest, e;
try {
xml Request = new XMLHttpRequest();
catch(e) { try {
xmlRequest = new ActiveXObject('Microsoft.XMLHTTP");
}
catch(e) { }
}
// Подготовка к отправке синхронного запроса
POST xmlRequest,ореп("POST". pageUrl. false);
xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlRequest.send(nul1);
return xmlRequest;
}
</script>
Функция в приведенном примере получает две строки — вызываемый URL и список параметров. Формат строки запроса никак не стандартизирован и может произвольно изменяться в каждой конкретной реализации.
В нашем примере URL, заданный программистом, дополняется парой параметров. Первый параметр ( outof в нашем примере) представляет собой логический флаг, который указывает, должен ли запрос обрабатываться пользовательской param в нашем примере) передаются входные параметры для кода, исполняемого на стороне сервера.
Код страницы выглядит примерно так:
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Testing Out-of-band</title>
</head>
<body>
<form id="Forml" runat="server">
<hl>Demonstrate Out-of-band Calls</hl>
<h2>%=Request.Url%></h2>
<hr />
<asp:DropDownList runat="server" ID="EmployeeList" />
<input id="Button1" type="button"
value="Go Get Data" onclick="MoreInfo()" />
<hr />
<span id="Msg" />
</form>
</body>
</html>
Класс программной логики ( code-behind class ) приведен в следующем листинге:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsOutOfBan())
return;
if (!IsPostBack)
PopulateList();
}
private bool IsOutOfBand()
{
if (Request.QueryString["outofband"] != null)
{
String param = Request.QueryString["param"].ToString();
Response.Write(ExecutePageMethod(param));
Response.Flush();
Response. End();
return true:
}
return false;
}
private void PopulateList()
{
SqlDataAdapter adapter = new SqlDataAdapter(
"SELECT employeeid, lastname FROM employees",
"SERVER=(1ocal); DATABASE=northwind; UID=...;");
DataTable table = new DataTable();
adapter.Fill(table);
EmployeeList.DataTextField = "lastname";
EmployeeList.DataValueField = "employeeid";
EmployeeList.DataSource = table;
EmployeeList.DataBind();
}
string ExecutePageMethod(string eventArgument) {
return "You clicked: " + eventArgument;
}
}
Внеполосный вызов ASP.NET начинается с выполнения функции JavaScript, предоставленной системой. Как правило, эта функция связывается с обработчиком события уровня страницы — такого, как щелчок на кнопке или изменение выбранной строки в раскрывающемся списке. Для наглядности рассмотрим конкретный пример.
Представьте веб-страницу, на которой отображается информация о работнике. Пользователь выбирает имя из списка и щелкает на кнопке, чтобы получить дополнительную информацию. Чтобы механизм внеполосного вызова успешно работал, кнопка не должна быть кнопкой отправки ( submit button ); в противном случае произойдет обычная отправка данных с полным обновлением страницы. Возьмем следующую разметку:
<asp:DropDownList ID="cboEmployees" runat="server"
DataTextField="lastname" DataValueFiel="employeeid" />
<input type="button" runat="server"
id="buttonTrigger" value="More Info">

Пользователь выбирает элемент из списка и щелкает на кнопке, чтобы получить дополнительную информацию. Обработчик события onclick кнопки добавляется динамически при обработке страницы на сервере. Такие вещи уместно делать при обработке события Page_Load:
protected void Page_Load (object sender, EventArgs e)
{
if (!IsPostBack)
{
// Заполнение списка
cboEmployees.DataSource = GetEmployeeList();
cboEmployees.DataBind();
// Построить средствами ASP.NET строку с функцией Javascript,
// вызываемой для инициирования внеполосного вызова
string rpc = ClientScript.GetCallbackEventReference(
this,
"document.forms[0].elements['cboEmployees'].value",
"UpdatePage",
"null",
"null",
false);
// Инициирование внеполосного вызова кнопкой
string js - String.Format("javascript:{0}". rpc):
buttonTrigger.Attributes["onclick"] = js:
}
}
private Collection<Employee> GetEmployeeList()
{
...
}
ASP.NET Script . Вместо этого следует направить все внимание на программный интерфейс метода GetCallbackEventReference объекта Page.ClientScript. Метод получает параметры, используемые при вызове, и возвращает строку с исходным кодом JavaScript, предназначенную для внедрения в страницу. Когда страница передается пользователю, кнопка, инициирующая внеполосный вызов, связывается со следующим сценарием:
<input name="buttonTrigger" type="button"
id="button1" value="More Info"
onclick="javascript:WebForm_DoCallback('__Page",
document.forms[0].elements['cboEmployees'].value,
UpdatePage,null, null, false)" />
сценарий хранится в ресурсах сборки и связывается со страницей при помощи динамически сгенерированной директивы включения сценария:
<script src="/ProAspNetAdv/WebResource.axd?d=...t=..." type="text/javascript"></script>
В странице, предоставленной пользователю, этот элемент располагается непосредственно за открывающим тегом .Не стоит и говорить, что вызывает объект и управляет запросом HTTP.
Возможности
Приложения с поддержкой
Архитектура возможностей
(рис 9.1) Клиентская и серверная архитектуры ASP.NET AJAX Иллюстрация демонстрирует функциональность клиентской Microsoft
Клиентская архитектура включает библиотеки для поддержки компонентов, совместимость с обозревателями, сетевые средства и базовые службы
С помощью клиентских компонентов реализуется обогащенный пользовательский интерфейс в обозревателе без операций обратной передачи. Компоненты делятся на три категории:
Тип используемого компонента зависит от требуемого типа клиентского поведения. Например, водяной знак в существующем текстовом поле можно создать, используя поведение, связанное с текстовым полем.
Библиотеки клиентских сценариев
Серверные составляющие, поддерживающие разработку с использованием технологии
Возможности
Можно также создавать пользовательские клиентские сценарии для приложений ASP.NET. В таком случае можно использовать возможности
Возможности ASP.NET
Благодаря поддержке сценариев
Функциональность
Можно также осуществлять доступ к веб-службам ASP.NET с использованием серверных элементов управления ASP.NET
Ниже приведен список наиболее часто используемых серверных элементов управления ASP.NET
ScriptManagerУправляет ресурсами сценариев для клиентских компонентов, частичной отрисовки страниц, локализации, глобализации и пользовательских сценариев. Элемент управления ScriptManager необходим для использования элементов управления UpdatePanel, UpdateProgress и Timer.
UpdatePanelПозволяет обновлять отдельные части страницы вместо обновления ее целиком, осуществляемого путем использования синхронной обратной передачи.
UpdateProgressПредоставляет информацию о состоянии касательно частичного обновления страницы в элементах управления UpdatePanel.
TimerВыполняет операции обратной передачи с заданной периодичностью. Элемент управления Timer можно использовать для периодического обновления всей страницы или же ее части; в последнем случае он используется совместно с элементом управления UpdatePanel.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.