- Статья
- Чтение занимает 40 мин
по Скотт Митчелл
Скачать код или скачать PDF
В этом учебнике мы будем отвечать на этот вопрос, создав очень элементарное приложение гостевой книги. При этом будут рассмотрены различные варианты моделирования сведений о пользователях в базе данных, а затем показано, как связать эти данные с учетными записями пользователей, созданными платформой членства.
Введение
Сценарии. Инфраструктура членства NET предлагает гибкий интерфейс для управления пользователями. API членства включает методы для проверки учетных данных, получения сведений о вошедшем в систему пользователе, создания новой учетной записи пользователя и удаления учетной записи пользователя в других. Каждая учетная запись пользователя в инфраструктуре членства содержит только свойства, необходимые для проверки учетных данных и выполнения необходимых задач, связанных с учетной записью пользователя. Это свидетельствует о методах и свойствах классаMembershipUser
, который моделирует учетную запись пользователя в инфраструктуре членства. Этот класс имеет такие свойства, как UserName
, Email
и IsLockedOut
, и такие методы, как GetPassword
и UnlockUser
.
Часто приложениям необходимо хранить дополнительные сведения о пользователе, не включенные в платформу членства. Например, в Интернет-магазине может потребоваться предоставить каждому пользователю возможность хранить адреса доставки и выставления счетов, платежные данные, параметры доставки и номер телефона. Кроме того, каждый заказ в системе связан с определенной учетной записью пользователя.
Класс MembershipUser
не включает такие свойства, как PhoneNumber
или DeliveryPreferences
или PastOrders
. Итак, как мы относимся к информации о пользователях, необходимой приложению, и они интегрируются с платформой членства? В этом учебнике мы будем отвечать на этот вопрос, создав очень элементарное приложение гостевой книги. При этом будут рассмотрены различные варианты моделирования сведений о пользователях в базе данных, а затем показано, как связать эти данные с учетными записями пользователей, созданными платформой членства. Приступим.
Шаг 1. Создание модели данных приложения гостевой книги
Существует множество методов, которые можно использовать для сбора сведений о пользователях в базе данных и связывания их с учетными записями пользователей, созданными платформой членства. Чтобы продемонстрировать эти методы, необходимо расширить веб-приложение Tutorial, чтобы оно захватывает некоторые данные, связанные с пользователем. (В настоящее время модель данных приложения содержит только таблицы служб приложений, необходимые для SqlMembershipProvider
.)
Давайте создадим очень простое приложение гостевой книги, где пользователь, прошедший проверку подлинности, может покинуть комментарий. Помимо хранения комментариев гостевой книги, давайте разберем каждому пользователю хранение своего домашнего города, домашней страницы и подписи. Если этот параметр указан, в каждом сообщении, которое он оставил в гостевой книге, будут отображаться домашние город, Домашняя страница и подпись пользователя.
Чтобы записать комментарии к гостевой книге, необходимо создать таблицу базы данных с именем GuestbookComments
со столбцами, такими как CommentId
, Subject
, Body
и CommentDate
. Также необходимо, чтобы каждая запись в таблице GuestbookComments
ссылалась на пользователя, который оставил комментарий.
Чтобы добавить эту таблицу в базу данных, перейдите к обозреватель базы данных в Visual Studio и выполните детализацию для базы данных SecurityTutorials
. Щелкните правой кнопкой мыши папку таблицы и выберите команду Добавить новую таблицу. Откроется интерфейс, позволяющий определить столбцы для новой таблицы.
Рис. 1. Добавление новой таблицы в базу данных SecurityTutorials
(щелкните, чтобы просмотреть изображение с полным размером)
Затем определите столбцы GuestbookComments
. Сначала добавьте столбец с именем CommentId
типа uniqueidentifier
. Этот столбец уникально идентифицирует каждый комментарий в гостевой книге, поэтому не следует NULL
s и пометить его как первичный ключ таблицы. Вместо того чтобы указывать значение для поля CommentId
в каждой INSERT
, можно указать, что новое значение uniqueidentifier
должно автоматически создаваться для этого поля в INSERT
, задав для столбца значение по умолчанию NEWID()
. После добавления первого поля, помечая его как первичный ключ, и настройки его значения по умолчанию экран должен выглядеть примерно так, как на снимке экрана, показанном на рис. 2.
Рис. 2. Добавление первичного столбца с именем CommentId
(щелкните, чтобы просмотреть изображение с полным размером)
Затем добавьте столбец с именем Subject
типа nvarchar(50)
и столбец с именем Body
типа nvarchar(MAX)
, который запрещает NULL
s в обоих столбцах. После этого добавьте столбец с именем CommentDate
типа datetime
. Запретите NULL
s и задайте для столбца CommentDate
значение по умолчанию getdate()
.
Остается только добавить столбец, связывающий учетную запись пользователя с каждым комментарием гостевой книги. Один из вариантов — добавить столбец с именем UserName
типа nvarchar(256)
. Это подходящий вариант при использовании поставщика членства, отличного от SqlMembershipProvider
. Но при использовании SqlMembershipProvider
, как описано в этой серии руководств, столбец UserName
в таблице aspnet_Users
не обязательно должен быть уникальным. Первичный ключ aspnet_Users
ной таблицы UserId
и имеет тип uniqueidentifier
. Таким образом, GuestbookComments
таблице требуется столбец с именем UserId
типа uniqueidentifier
(запрещенные значения NULL
). Добавьте этот столбец.
Note
Как мы обсуждали в руководстве Создание схемы членства в SQL Server , платформа членства разработана так, чтобы несколько веб-приложений с разными учетными записями пользователей совместно использовать одно и то же хранилище пользователей. Это достигается путем секционирования учетных записей пользователей в разные приложения. И хотя каждое имя пользователя гарантированно уникально в пределах приложения, одно и то же имя пользователя может использоваться в разных приложениях, использующих одно хранилище пользователей. В таблице aspnet_Users
в полях UserName
и ApplicationId
имеется составное ограничение UNIQUE
, но не одно в поле UserName
. Следовательно, в таблице ASPNET_Users можно иметь две (или более) записи с одинаковым значением UserName
. Однако существует ограничение UNIQUE
для поля UserId
таблицы aspnet_Users
(поскольку оно является первичным ключом). Ограничение UNIQUE
важно, поскольку без него невозможно установить ограничение внешнего ключа между таблицами GuestbookComments
и aspnet_Users
.
После добавления столбца UserId
сохраните таблицу, щелкнув значок сохранить на панели инструментов. Присвойте новой таблице имя GuestbookComments
.
У нас есть последняя ошибка для участия в GuestbookComments
таблице: необходимо создать ограничение внешнего ключа между столбцом GuestbookComments.UserId
и столбцом aspnet_Users.UserId
. Чтобы добиться этого, щелкните значок связи на панели инструментов, чтобы открыть диалоговое окно связи внешних ключей. (Также можно запустить это диалоговое окно, перейдя в меню конструктор таблиц и выбрав пункт связи.)
Нажмите кнопку Добавить в левом нижнем углу диалогового окна связи внешнего ключа. Это приведет к добавлению нового ограничения внешнего ключа, хотя все равно необходимо определить таблицы, участвующие в связи.
Рис. 3. диалоговое окно «связи внешнего ключа» используется для управления ограничениями внешнего ключа таблицы (щелкните, чтобы просмотреть изображение с полным размером)
Затем щелкните значок с многоточием в строке «спецификации таблиц и столбцов» справа. Откроется диалоговое окно таблицы и столбцы, в котором можно указать таблицу первичного ключа, столбец и внешний ключевой столбец из таблицы GuestbookComments
. В частности, выберите aspnet_Users
и UserId
в качестве таблицы и столбца первичного ключа и UserId
из таблицы GuestbookComments
в качестве внешнего ключевого столбца (см. рис. 4). Определив первичные и внешние ключи и таблицы и столбцы внешнего ключа, нажмите кнопку ОК, чтобы вернуться в диалоговое окно связи внешних ключей.
Рис. 4. определение ограничения внешнего ключа между таблицами aspnet_Users
и GuesbookComments
(щелкните, чтобы просмотреть изображение с полным размером)
На этом этапе было установлено ограничение внешнего ключа. Наличие этого ограничения обеспечивает реляционную целостность двух таблиц, гарантируя тем самым, что никогда не будет являться запись в гостевой книге, ссылающейся на несуществующую учетную запись пользователя. По умолчанию ограничение внешнего ключа запрещает удаление родительской записи при наличии соответствующих дочерних записей. Это значит, что если пользователь создает одну или несколько комментариев гостевой книги, а затем пытается удалить эту учетную запись пользователя, удаление завершится ошибкой, если сначала не будут удалены комментарии к гостевой книге.
Ограничения внешнего ключа можно настроить на автоматическое удаление связанных дочерних записей при удалении родительской записи. Иными словами, можно настроить ограничение внешнего ключа таким образом, чтобы записи гостевой книги пользователя автоматически удалялись при удалении учетной записи пользователя. Для этого разверните раздел «Вставка и обновление спецификации» и задайте для свойства «удалить правило» значение Cascade.
Рис. 5. Настройка ограничения внешнего ключа на каскадное удаление (щелкните, чтобы просмотреть изображение с полным размером)
Чтобы сохранить ограничение внешнего ключа, нажмите кнопку «Закрыть», чтобы выйти из связей внешнего ключа. Затем щелкните значок сохранить на панели инструментов, чтобы сохранить таблицу и эту связь.
Хранение домашнего города, домашней страницы и подписи пользователя
В GuestbookComments
таблице показано, как хранить сведения, которые совместно используют связь «один ко многим» с учетными записями пользователей. Так как каждая учетная запись пользователя может иметь произвольное количество связанных комментариев, эта связь моделируется путем создания таблицы для хранения набора комментариев, включающих в себя столбец, связывающий каждый комментарий с конкретным пользователем. При использовании SqlMembershipProvider
эту ссылку лучше установить, создав столбец с именем UserId
типа uniqueidentifier
и ограничение внешнего ключа между этим столбцом и aspnet_Users.UserId
.
Теперь нам нужно связать три столбца с каждой учетной записью пользователя для хранения домашнего города пользователя, домашней страницы и подписи, которые будут отображаться в комментариях к гостевой книге. Это можно сделать несколькими способами:
-
Добавьте новые столбцы в
aspnet_Users
илиaspnet_Membership
таблицы. Я не рекомендую этот подход, так как он изменяет схему, используемуюSqlMembershipProvider
. Это решение может вернуться к хаунт в дороге. Например, если в будущей версии ASP.NET используется другая схемаSqlMembershipProvider
. Корпорация Майкрософт может включить средство для переноса данных ASP.NET 2,0SqlMembershipProvider
в новую схему, но если вы изменили схему ASP.NET 2,0SqlMembershipProvider
, такое преобразование может оказаться невозможным. -
Используйте технологию ASP. Инфраструктура профиля NET, определяющая свойство профиля для домашнего города, домашней страницы и подписи. ASP.NET включает платформу профилей, предназначенную для хранения дополнительных данных, относящихся к пользователю. Как и в случае с инфраструктурой членства, инфраструктура профилей строится на основе модели поставщика. .NET Framework поставляется с
SqlProfileProvider
ссат хранит данные профиля в базе данных SQL Server. На самом деле наша база данных уже содержит таблицу, используемуюSqlProfileProvider
(aspnet_Profile
), так как она была добавлена при добавлении служб приложений обратно в руководство по созданию схемы членства в SQL Server .
Основным преимуществом платформы Profile Framework является то, что он позволяет разработчикам определять свойства профиля вWeb.config
— не требуется написание кода для сериализации данных профиля в базовое хранилище данных и из него. Вкратце, чрезвычайно просто определить набор свойств профиля и работать с ними в коде. Тем не менее система профиля остается очень необходимой, когда дело доходит до управления версиями, поэтому, если у вас есть приложение, в котором вы предполагаете добавить новые свойства для конкретного пользователя позднее, или удалить или изменить существующие, то платформа профиля может не быть наилучший вариант. Более того,SqlProfileProvider
сохраняет свойства профиля в сильно денормализованном виде, делая их более невозможными для выполнения запросов непосредственно по данным профиля (например, количество пользователей в дом Нью-Йорк).
Дополнительные сведения о структуре профиля см. в разделе «дополнительные считывания» в конце этого руководства. -
Добавьте эти три столбца в новую таблицу базы данных и установите связь «один к одному» между этой таблицей и
aspnet_Users
. Этот подход требует немного больше работы, чем при использовании структуры профиля, но обеспечивает максимальную гибкость в том, как в базе данных моделируются дополнительные свойства пользователя. Это вариант, который мы будем использовать в этом руководстве.
Мы создадим новую таблицу с именем UserProfiles
, чтобы сохранить домашний город, домашнюю страницу и подпись для каждого пользователя. Щелкните правой кнопкой мыши папку таблицы в окне обозреватель базы данных и выберите создать новую таблицу. Присвойте первому столбцу имя UserId
и задайте для его типа значение uniqueidentifier
. Запрет NULL
значений и Пометка столбца в качестве первичного ключа. Затем добавьте столбцы с именем: HomeTown
типа nvarchar(50)
; HomepageUrl
типа nvarchar(100)
; и сигнатура типа nvarchar(500)
. Каждый из этих трех столбцов может принимать значение NULL
.
Рис. 6. создание таблицы UserProfiles
(щелкните, чтобы просмотреть изображение с полным размером)
Сохраните таблицу и назовите ее UserProfiles
. Наконец, установите ограничение внешнего ключа между UserId
ным полем UserProfiles
таблицы и полем aspnet_Users.UserId
. Как и в случае с ограничением внешнего ключа между таблицами GuestbookComments
и aspnet_Users
, это ограничение каскадным удалением. Так как поле UserId
в UserProfiles
является первичным ключом, это гарантирует, что в таблице UserProfiles
для каждой учетной записи пользователя будет не более одной записи. Этот тип связи называется «один к одному».
Теперь, когда мы создали модель данных, мы готовы к ее использованию. В шагах 2 и 3 мы рассмотрим, как пользователь, выполнивший вход в систему, может просматривать и редактировать домашний город, домашнюю страницу и сведения о подписи. На шаге 4 мы создадим интерфейс для пользователей, прошедших проверку подлинности, для отправки новых комментариев в гостевой книге и просмотра существующих.
Шаг 2. Отображение домашнего города, домашней страницы и подписи пользователя
Существует множество способов разрешить пользователю, вошедшему в систему, просматривать и изменять домашний город, домашнюю страницу и сведения о подписи. Можно вручную создать пользовательский интерфейс с элементами управления TextBox и Label или использовать один из веб-элементов управления данными, например элемент управления DetailsView. Для выполнения SELECT
базы данных и UPDATE
инструкций можно написать код ADO.NET в классе кода программной части страницы или же использовать декларативный подход с SqlDataSource. В идеале наше приложение будет содержать многоуровневую архитектуру, которую можно либо вызывать программно из класса кода программной части страницы, либо декларативно с помощью элемента управления ObjectDataSource.
Поскольку эта серия руководств посвящена проверке подлинности на основе форм, авторизации, учетных записей пользователей и ролей, не будет подробно обсуждать эти различные варианты доступа к данным или почему многоуровневая архитектура предпочтительнее непосредственного выполнения инструкций SQL. на странице ASP.NET. Я покажу, как использовать DetailsView и SqlDataSource — самый быстрый и простой способ — но описанные концепции можно применять к альтернативным веб-элементам управления и логике доступа к данным. Дополнительные сведения о работе с данными в ASP.NET см. в статье Руководство по работе с данными в ASP.NET 2,0 .
Откройте страницу AdditionalUserInfo.aspx
в папке Membership
и добавьте на страницу элемент управления DetailsView, присвоив свойству ID
значение UserProfile
и удалив свойства Width
и Height
. Разверните смарт-тег DetailsView и выберите его привязку к новому элементу управления источниками данных. Запустится мастер настройки источника данных (см. рис. 7). На первом шаге будет предложено указать тип источника данных. Так как мы будем подключаться непосредственно к базе данных SecurityTutorials
, щелкните значок базы данных, указав ID
как UserProfileDataSource
.
Рис. 7. Добавление нового элемента управления SqlDataSource с именем UserProfileDataSource
(щелкните, чтобы просмотреть изображение с полным размером)
На следующем экране запрашивается использование базы данных. Мы уже определили строку подключения в Web.config
для базы данных SecurityTutorials
. Это имя строки подключения — SecurityTutorialsConnectionString
— должно быть в раскрывающемся списке. Выберите этот параметр и нажмите кнопку Далее.
Рис. 8. Выбор SecurityTutorialsConnectionString
из раскрывающегося списка (щелкните, чтобы просмотреть изображение с полным размером)
На следующем экране будет предложено указать таблицу и столбцы для запроса. Выберите таблицу UserProfiles
из раскрывающегося списка и проверьте все столбцы.
Рис. 9. возврат всех столбцов из таблицы UserProfiles
(щелкните, чтобы просмотреть изображение с полным размером)
Текущий запрос на рис. 9 возвращает все записи в UserProfiles
, но мы заинтересованы только в записи текущего пользователя, вошедшего в систему. Чтобы добавить предложение WHERE
, нажмите кнопку WHERE
, чтобы открыть диалоговое окно Добавление предложения WHERE
(см. рис. 10). Здесь можно выбрать столбец для фильтрации, оператор и источник параметра фильтра. В качестве оператора выберите UserId
в качестве столбца и «=».
К сожалению, нет встроенного источника параметров для возврата значения UserId
текущего пользователя, вошедшего в систему. Это значение необходимо извлечь программно. Поэтому в раскрывающемся списке Источник выберите значение нет, нажмите кнопку Добавить, чтобы добавить параметр, а затем нажмите кнопку ОК.
Рис. 10. Добавление параметра фильтра в столбец UserId
(щелкните, чтобы просмотреть изображение с полным размером)
После нажатия кнопки ОК вы вернетесь на экран, показанный на рис. 9. Однако на этот раз SQL-запрос в нижней части экрана должен содержать предложение WHERE
. Нажмите кнопку Далее, чтобы перейти на экран тестовый запрос. Здесь можно выполнить запрос и просмотреть результаты. Нажмите кнопку Готово, чтобы завершить работу с мастером.
После завершения работы мастера настройки источника данных Visual Studio создает элемент управления SqlDataSource на основе параметров, заданных в мастере. Более того, он вручную добавляет BoundFields к элементу DetailsView для каждого столбца, возвращаемого SelectCommand
ом SqlDataSource. Нет необходимости показывать поле UserId
в DetailsView, так как пользователю не нужно знать это значение. Это поле можно удалить непосредственно из декларативной разметки элемента управления DetailsView или щелкнув ссылку «изменить поля» из своего смарт-тега.
На этом этапе декларативная разметка страницы должна выглядеть следующим образом:
<asp:DetailsView ID="UserProfile" runat="server"
AutoGenerateRows="False" DataKeyNames="UserId"
DataSourceID="UserProfileDataSource">
<Fields>
<asp:BoundField DataField="HomeTown" HeaderText="HomeTown"
SortExpression="HomeTown" />
<asp:BoundField DataField="HomepageUrl" HeaderText="HomepageUrl"
SortExpression="HomepageUrl" />
<asp:BoundField DataField="Signature" HeaderText="Signature"
SortExpression="Signature" />
</Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="UserProfileDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:SecurityTutorialsConnectionString %>"
SelectCommand="SELECT [UserId], [HomeTown], [HomepageUrl], [Signature] FROM
[UserProfiles] WHERE ([UserId] = @UserId)">
<SelectParameters>
<asp:Parameter Name="UserId" Type="Object" />
</SelectParameters>
</asp:SqlDataSource>
Прежде чем выбирать данные, необходимо программно задать параметр UserId
элемента управления SqlDataSource до UserId
текущего пользователя. Это можно сделать, создав обработчик событий для события Selecting
SqlDataSource и добавив следующий код:
protected void UserProfileDataSource_Selecting(object sender,
SqlDataSourceSelectingEventArgs e)
{
// Get a reference to the currently logged on user
MembershipUser currentUser = Membership.GetUser();
// Determine the currently logged on user's UserId value
Guid currentUserId = (Guid)currentUser.ProviderUserKey;
// Assign the currently logged on user's UserId to the @UserId parameter
e.Command.Parameters["@UserId"].Value = currentUserId;
}
Приведенный выше код начинается с получения ссылки на текущего пользователя, находящегося в системе, путем вызова метода GetUser
класса Membership
. Он возвращает объект MembershipUser
, свойство ProviderUserKey
которого содержит UserId
. Затем значение UserId
присваивается параметру @UserId
SqlDataSource.
Note
Метод Membership.GetUser()
возвращает сведения о вошедшем в систему пользователе. Если анонимный пользователь посещает страницу, он возвратит значение null
. В этом случае это приводит к NullReferenceException
у в следующей строке кода при попытке чтения свойства ProviderUserKey
. Конечно, нам не нужно беспокоиться о том, Membership.GetUser()
возвращать null
значение на странице AdditionalUserInfo.aspx
, так как мы настроили авторизацию URL-адресов в предыдущем руководстве, чтобы только пользователи, прошедшие проверку подлинности, могли получить доступ к ресурсам ASP.NET в этой папке. Если необходимо получить доступ к сведениям о вошедшем в систему пользователе на странице, где разрешен анонимный доступ, убедитесь, что в методе GetUser()
возвращается объект, не являющийсяnull MembershipUser
, прежде чем ссылаться на его свойства.
Если вы посещаете страницу AdditionalUserInfo.aspx
в браузере, вы увидите пустую страницу, так как нам еще не нужно добавлять какие-либо строки в таблицу UserProfiles
. На шаге 6 мы рассмотрим, как настроить элемент управления CreateUserWizard для автоматического добавления новой строки в таблицу UserProfiles
при создании новой учетной записи пользователя. Однако теперь необходимо вручную создать запись в таблице.
Перейдите к обозреватель базы данных в Visual Studio и разверните папку таблицы. Щелкните правой кнопкой мыши таблицу aspnet_Users
и выберите команду «Показать данные таблицы», чтобы просмотреть записи в таблице. Сделайте то же самое для таблицы UserProfiles
. На рис. 11 показаны эти результаты при вертикальном мозаичном заполнении. В базе данных в настоящее время aspnet_Users
записи для Брюс, Fred и Тито, но нет записей в таблице UserProfiles
.
Рис. 11. Отображение содержимого таблиц aspnet_Users
и UserProfiles
(щелкните, чтобы просмотреть изображение с полным размером)
Добавьте новую запись в UserProfiles
таблицу, введя значения полей HomeTown
, HomepageUrl
и Signature
вручную. Самый простой способ получить допустимое значение UserId
в новой записи UserProfiles
— выбрать поле UserId
из определенной учетной записи пользователя в таблице aspnet_Users
, а затем скопировать и вставить его в поле UserId
в UserProfiles
. На рис. 12 показана UserProfiles
ная таблица после добавления новой записи для Брюс.
Рис. 12. запись добавлена в UserProfiles
для Брюс (щелкните, чтобы просмотреть изображение с полным размером)
Вернитесь на страницу AdditionalUserInfo.aspx
, войдя в систему как Брюс. Как показано на рис. 13, отображаются параметры Брюс.
Рис. 13. сведения о текущем посещенном пользователе отображаются в его настройках (щелкните, чтобы просмотреть изображение с полным размером)
Note
Вручную добавьте записи в таблицу UserProfiles
для каждого пользователя членства. На шаге 6 мы рассмотрим, как настроить элемент управления CreateUserWizard для автоматического добавления новой строки в таблицу UserProfiles
при создании новой учетной записи пользователя.
Шаг 3. Разрешение пользователю на изменение домашнего города, домашней страницы и подписи
На этом этапе текущий пользователь, выполнивший вход в систему, может просматривать свои домашние город, домашнюю страницу и параметры подписи, но они пока не могут изменить их. Давайте изменим элемент управления DetailsView, чтобы можно было изменять данные.
Первое, что нам нужно сделать, — это добавить UpdateCommand
для SqlDataSource, указав инструкцию UPDATE
для выполнения и соответствующие параметры. Выберите элемент SqlDataSource и в окно свойств щелкните многоточие рядом со свойством Упдатекуери, чтобы открыть диалоговое окно Редактор параметров и команд. Введите следующую инструкцию UPDATE
в текстовое поле:
UPDATE UserProfiles SET
HomeTown = @HomeTown,
HomepageUrl = @HomepageUrl,
Signature = @Signature
WHERE UserId = @UserId
Затем нажмите кнопку «обновить параметры», которая создаст параметр в коллекции UpdateParameters
элемента управления SqlDataSource для каждого из параметров в инструкции UPDATE
. Оставьте в поле источник все параметры, для которых установлено значение нет, и нажмите кнопку ОК, чтобы закрыть диалоговое окно.
Рис. 14. Указание UpdateCommand
и UpdateParameters
SqlDataSource (щелкните, чтобы просмотреть изображение с полным размером)
Из-за дополнений к элементу управления SqlDataSource элемент управления DetailsView теперь может поддерживать редактирование. В смарт-теге DetailsView установите флажок «Разрешить изменение». При этом в коллекцию Fields
элемента управления добавляется CommandField со свойством ShowEditButton
, установленным в значение true. При отображении элемента DetailsView в режиме только для чтения и кнопках обновить и Отмена в режиме редактирования отображается кнопка Изменить. Однако, вместо того чтобы требовать от пользователя нажатия кнопки изменить, можно отобразить элемент DetailsView в состоянии «всегда изменять», установив для свойстваDefaultMode
элемента управления detailsview значение Edit
.
После внесения этих изменений декларативная разметка элемента управления DetailsView должна выглядеть следующим образом:
<asp:DetailsView ID="UserProfile" runat="server"
AutoGenerateRows="False" DataKeyNames="UserId"
DataSourceID="UserProfileDataSource" DefaultMode="Edit">
<Fields>
<asp:BoundField DataField="HomeTown" HeaderText="HomeTown"
SortExpression="HomeTown" />
<asp:BoundField DataField="HomepageUrl" HeaderText="HomepageUrl"
SortExpression="HomepageUrl" />
<asp:BoundField DataField="Signature" HeaderText="Signature"
SortExpression="Signature" />
<asp:CommandField ShowEditButton="True" />
</Fields>
</asp:DetailsView>
Обратите внимание на добавление CommandField и свойства DefaultMode
.
Протестируйте эту страницу в браузере. При посещении с пользователем, имеющим соответствующую запись в UserProfiles
, параметры пользователя отображаются в изменяемом интерфейсе.
Рис. 15. элемент DetailsView визуализирует редактируемый интерфейс (щелкните, чтобы просмотреть изображение с полным размером)
Попробуйте изменить значения и нажмите кнопку Обновить. Оно кажется, если ничего не происходит. Обратная передача и значения сохраняются в базе данных, но визуальная обратная связь, возникшая при сохранении, отсутствует.
Чтобы устранить эту проблему, вернитесь в Visual Studio и добавьте элемент управления Label над элементом DetailsView. Задайте для его ID
значение SettingsUpdatedMessage
, его свойству Text
значение «ваши параметры обновлены», а для свойств Visible
и EnableViewState
— false
.
<asp:Label ID="SettingsUpdatedMessage" runat="server"
Text="Your settings have been updated."
EnableViewState="false"
Visible="false"></asp:Label>
При каждом обновлении элемента DetailsView необходимо отображать метку SettingsUpdatedMessage
. Для этого создайте обработчик событий для события ItemUpdated
DetailsView и добавьте следующий код:
protected void UserProfile_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
{
SettingsUpdatedMessage.Visible = true;
}
Вернитесь на AdditionalUserInfo.aspx
страницу в браузере и обновите данные. На этот раз отображается полезное сообщение о состоянии.
Рис. 16. при обновлении параметров отображается короткое сообщение (щелкните, чтобы просмотреть изображение с полным размером)
Note
Интерфейс правки элемента управления DetailsView оставляет много необходимости. В ней используются текстовые поля стандартного размера, но поле подписи, возможно, является многострочным текстовым полем. Регуларекспрессионвалидатор должен использоваться, чтобы гарантировать, что URL-адрес домашней страницы, если он указан, начинается с «http://» или «https://». Более того, поскольку для элемента управления DetailsView свойство DefaultMode
имеет значение Edit
, кнопка Отмена не выполняет никаких действий. Он должен быть либо удален, либо, при щелчке, перенаправлять пользователя на другую страницу (например, ~/Default.aspx
). Я оставлю эти улучшения в качестве упражнения для читателя.
Добавление ссылки на страницуAdditionalUserInfo.aspx
на главной странице
В настоящее время веб-сайт не предоставляет ссылки на страницу AdditionalUserInfo.aspx
. Единственный способ достичь этого — ввести URL-адрес страницы непосредственно в адресную строку браузера. Давайте добавим ссылку на эту страницу на главной странице Site.master
.
Вспомним, что Главная страница содержит веб-элемент управления LoginView в его LoginContent
ContentPlaceHolder, который отображает различную разметку для прошедших проверку подлинности и анонимных посетителей. Обновите LoggedInTemplate
элемента управления LoginView, чтобы включить ссылку на страницу AdditionalUserInfo.aspx
. После внесения этих изменений декларативная разметка элемента управления LoginView должна выглядеть следующим образом:
<asp:LoginView ID="LoginView1" runat="server">
<LoggedInTemplate>
Welcome back,
<asp:LoginName ID="LoginName1" runat="server" />.
<br />
<asp:HyperLink ID="lnkUpdateSettings" runat="server"
NavigateUrl="~/Membership/AdditionalUserInfo.aspx">
Update Your Settings</asp:HyperLink>
</LoggedInTemplate>
<AnonymousTemplate>
Hello, stranger.
</AnonymousTemplate>
</asp:LoginView>
Обратите внимание на добавление элемента управления HyperLink lnkUpdateSettings
в LoggedInTemplate
. С помощью этой ссылки пользователи, прошедшие проверку подлинности, могут быстро перейти на страницу, чтобы просмотреть и изменить параметры домашнего города, домашней страницы и подписи.
Страница Guestbook.aspx
, где пользователи с проверкой подлинности могут просматривать гостевую книгу и оставлять комментарий. Начнем с создания интерфейса для добавления новых комментариев гостевой книги.
Откройте страницу Guestbook.aspx
в Visual Studio и создайте пользовательский интерфейс, состоящий из двух элементов управления TextBox: один для темы нового комментария и один для его тела. Присвойте свойству ID
первого текстового элемента управления значение Subject
, а свойству Columns
— значение 40; Задайте для второго ID
значение Body
, его TextMode
MultiLine
, а также Width
и Rows
свойства в значение «95%» и 8 соответственно. Чтобы завершить пользовательский интерфейс, добавьте веб-элемент управления Button с именем PostCommentButton
и задайте для его свойства Text
значение «опубликовать комментарий».
Поскольку каждому комментарию гостевой книги требуется тема и текст, добавьте RequiredFieldValidator для каждого из текстовых полей. Задайте для свойства ValidationGroup
этих элементов управления значение «Ентеркоммент». Аналогичным образом задайте для свойства ValidationGroup
элемента управления PostCommentButton
значение «Ентеркоммент». Дополнительные сведения о ASP. Элементы управления проверки в сети, изучите проверку формы в ASP.NET, которая разбила элементы управления проверки в ASP.NET 2,0, а также учебник по элементам управления сервера проверки в W3Schools.
После создания пользовательского интерфейса декларативная разметка страницы должна выглядеть примерно следующим образом:
<h3>Leave a Comment</h3>
<p>
<b>Subject:</b>
<asp:RequiredFieldValidator ID="SubjectReqValidator" runat="server"
ErrorMessage="You must provide a value for Subject"
ControlToValidate="Subject" ValidationGroup="EnterComment">
</asp:RequiredFieldValidator><br/>
<asp:TextBox ID="Subject" Columns="40" runat="server"></asp:TextBox>
</p>
<p>
<b>Body:</b>
<asp:RequiredFieldValidator ID="BodyReqValidator" runat="server"
ControlToValidate="Body"
ErrorMessage="You must provide a value for Body" ValidationGroup="EnterComment">
</asp:RequiredFieldValidator><br/>
<asp:TextBox ID="Body" TextMode="MultiLine" Width="95%"
Rows="8" runat="server"></asp:TextBox>
</p>
<p>
<asp:Button ID="PostCommentButton" runat="server"
Text="Post Your Comment"
ValidationGroup="EnterComment" />
</p>
После завершения работы с пользовательским интерфейсом нашей следующей задачей является вставка новой записи в таблицу GuestbookComments
при нажатии на PostCommentButton
. Это можно сделать несколькими способами: можно написать код ADO.NET в обработчике событий Click
кнопки. на страницу можно добавить элемент управления SqlDataSource, настроить его InsertCommand
, а затем вызвать его метод Insert
из обработчика событий Click
. или можно создать средний уровень, отвечающий за вставку новых комментариев гостевой книги, и вызвать эту функцию из обработчика Click
событий. Так как мы рассматривали использование SqlDataSource на шаге 3, давайте используем здесь код ADO.NET.
Note
Классы ADO.NET, используемые для программного доступа к данным из базы данных Microsoft SQL Server, находятся в пространстве имен System.Data.SqlClient
. Может потребоваться импортировать это пространство имен в класс кода программной части страницы (т. е. using System.Data.SqlClient;
).
Создайте обработчик событий для Click
события PostCommentButton
и добавьте следующий код:
protected void PostCommentButton_Click(object sender, EventArgs e)
{
if (!Page.IsValid)
return;
// Determine the currently logged on user's UserId
MembershipUser currentUser = Membership.GetUser();
Guid currentUserId = (Guid)currentUser.ProviderUserKey;
// Insert a new record into GuestbookComments
string connectionString =
ConfigurationManager.ConnectionStrings["SecurityTutorialsConnectionString"].ConnectionString;
string insertSql = "INSERT INTO GuestbookComments(Subject, Body, UserId) VALUES(@Subject,
@Body, @UserId)";
using (SqlConnection myConnection = new SqlConnection(connectionString))
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand(insertSql, myConnection);
myCommand.Parameters.AddWithValue("@Subject", Subject.Text.Trim());
myCommand.Parameters.AddWithValue("@Body", Body.Text.Trim());
myCommand.Parameters.AddWithValue("@UserId", currentUserId);
myCommand.ExecuteNonQuery();
myConnection.Close();
}
// "Reset" the Subject and Body TextBoxes
Subject.Text = string.Empty;
Body.Text = string.Empty;
}
Обработчик событий Click
начинает с проверки допустимости предоставленных пользователем данных. Если это не так, обработчик событий завершает работу перед вставкой записи. Предполагая, что предоставленные данные допустимы, UserId
значение текущего пользователя, вошедшего в систему, извлекается и сохраняется в currentUserId
локальной переменной. Это значение требуется, поскольку при вставке записи в GuestbookComments
необходимо указать значение UserId
.
После этого строка подключения для базы данных SecurityTutorials
извлекается из Web.config
и указывается инструкция SQL INSERT
. Затем создается и открывается объект SqlConnection
. Затем создается объект SqlCommand
и приводятся значения параметров, используемых в запросе INSERT
. Затем выполняется инструкция INSERT
и соединение закрывается. В конце обработчика событий Text
свойства Subject
и Body
текстовые поля удаляются, чтобы значения пользователя не сохранялись во время обратной передачи.
Протестируйте эту страницу в браузере. Так как эта страница находится в папке Membership
, она недоступна для анонимных посетителей. Поэтому сначала необходимо войти в систему (если вы еще не сделали этого). Введите значение в поля Subject
и Body
и нажмите кнопку PostCommentButton
. Это приведет к добавлению новой записи в GuestbookComments
. При обратной передаче указанная тема и текст очищаются из текстовых полей.
После нажатия кнопки PostCommentButton
нет визуального отзыва о том, что комментарий добавлен в гостевую книгу. Нам по-прежнему нужно обновить эту страницу, чтобы отобразить комментарии к существующей гостевой книге, которые мы будем делать на шаге 5. После этого только что добавленный комментарий появится в списке комментариев, предоставляя достаточный визуальный отзыв. Пока убедитесь, что комментарий к гостевой книге сохранен, проверив содержимое таблицы GuestbookComments
.
На рис. 17 показано содержимое таблицы GuestbookComments
после того, как были оставлены два комментария.
Рис. 17. комментарии к гостевой книге можно просмотреть в таблице GuestbookComments
(щелкните, чтобы просмотреть изображение с полным размером).
Note
Если пользователь пытается вставить комментарий гостевой книги, содержащий потенциально опасную разметку, например HTML – ASP.NET, выдается исключение HttpRequestValidationException
. Чтобы узнать больше об этом исключении, о том, почему оно выдается и как позволить пользователям отправлять потенциально опасные значения, ознакомьтесь с документом о проверке запросов.
Кроме комментариев, пользователь, посещаемый на странице Guestbook.aspx
, также должен иметь возможность просматривать существующие комментарии в гостевой книге. Для этого добавьте элемент управления ListView с именем CommentList
в нижнюю часть страницы.
Note
Элемент управления ListView является новым для ASP.NET версии 3,5. Он предназначен для вывода списка элементов в очень настраиваемом и гибком макете, но по-прежнему предлагает встроенные функции редактирования, вставки, удаления, разбиения на страницы и сортировки, например GridView. При использовании ASP.NET 2,0 необходимо использовать элемент управления DataList или Repeater. Дополнительные сведения об использовании ListView см. в записях блога Скотта Гатри (, элементе управления ASP: ListViewи моей статье Отображение данных с помощью элемента управления ListView.
Откройте смарт-тег ListView и в раскрывающемся списке Выбор источника данных привяжите элемент управления к новому источнику данных. Как было показано на шаге 2, это приведет к запуску мастера настройки источника данных. Щелкните значок базы данных, присвойте результирующему CommentsDataSource
у SqlDataSource имя и нажмите кнопку ОК. Затем выберите строку подключения SecurityTutorialsConnectionString
из раскрывающегося списка и нажмите кнопку Далее.
На этом этапе в шаге 2 мы указали данные для запроса, выбирая UserProfiles
таблицу из раскрывающегося списка и выбрав возвращаемые столбцы (см. рис. 9). Но на этот раз мы хотим создать инструкцию SQL, которая извлекает не только записи из GuestbookComments
, но и домашний город, Домашняя страница, подпись и имя пользователя. Поэтому выберите переключатель «указать пользовательскую инструкцию SQL или хранимую процедуру» и нажмите кнопку «Далее».
Откроется экран «Определение пользовательских инструкций или хранимых процедур». Нажмите кнопку конструктор запросов, чтобы построить графический запрос. Конструктор запросов начинается с запроса на указание таблиц, из которых нужно выполнить запрос. Выберите таблицы GuestbookComments
, UserProfiles
и aspnet_Users
и нажмите кнопку ОК. Это приведет к добавлению всех трех таблиц в область конструктора. Поскольку существуют ограничения внешнего ключа для таблиц GuestbookComments
, UserProfiles
и aspnet_Users
, конструктор запросов автоматически JOIN
эти таблицы.
Остается только указать возвращаемые столбцы. В таблице GuestbookComments
выберите столбцы Subject
, Body
и CommentDate
. возвращают столбцы HomeTown
, HomepageUrl
и Signature
из таблицы UserProfiles
. и возвращают UserName
из aspnet_Users
. Кроме того, добавьте «ORDER BY CommentDate DESC
» в конец запроса SELECT
, чтобы последние записи возвращались первыми. После выбора этих параметров интерфейс конструктор запросов должен выглядеть примерно так, как на снимке экрана на рис. 18.
Рис. 18. сконструированный запрос JOIN
таблицы GuestbookComments
, UserProfiles
и aspnet_Users
(щелкните,чтобы просмотреть изображение с полным размером)
Нажмите кнопку ОК, чтобы закрыть окно конструктор запросов и вернуться к экрану «Определение пользовательских инструкций или хранимых процедур». Нажмите кнопку Далее, чтобы перейти на экран тестовый запрос, где можно просмотреть результаты запроса, нажав кнопку проверить запрос. Когда будете готовы, нажмите кнопку Готово, чтобы завершить работу мастера настройки источника данных.
После завершения работы мастера настройки источника данных на шаге 2 связанная коллекция Fields
элемента управления DetailsView была обновлена для включения BoundField для каждого столбца, возвращаемого SelectCommand
. Однако ListView остается без изменений; нам по-прежнему нужно определить макет. Макет ListView может быть создан вручную с помощью декларативной разметки или из параметра «настроить ListView» в его смарт-теге. Обычно я предпочитаю определять разметку вручную, но использовать любой из самых естественных методов.
Закончено использование следующих LayoutTemplate
, ItemTemplate
и ItemSeparatorTemplate
для элемента управления ListView:
<asp:ListView ID="CommentList" runat="server" DataSourceID="CommentsDataSource">
<LayoutTemplate>
<span ID="itemPlaceholder" runat="server" />
<p>
<asp:DataPager ID="DataPager1" runat="server">
<Fields>
<asp:NextPreviousPagerField ButtonType="Button"
ShowFirstPageButton="True"
ShowLastPageButton="True" />
</Fields>
</asp:DataPager>
</p>
</LayoutTemplate>
<ItemTemplate>
<h4><asp:Label ID="SubjectLabel" runat="server"
Text='<%# Eval("Subject") %>' /></h4>
<asp:Label ID="BodyLabel" runat="server"
Text='<%# Eval("Body").ToString().Replace(Environment.NewLine, "<br />") %>' />
<p>
---<br />
<asp:Label ID="SignatureLabel" Font-Italic="true" runat="server"
Text='<%# Eval("Signature") %>' />
<br />
<br />
My Home Town:
<asp:Label ID="HomeTownLabel" runat="server"
Text='<%# Eval("HomeTown") %>' />
<br />
My Homepage:
<asp:HyperLink ID="HomepageUrlLink" runat="server"
NavigateUrl='<%# Eval("HomepageUrl") %>'
Text='<%# Eval("HomepageUrl") %>' />
</p>
<p align="center">
Posted by
<asp:Label ID="UserNameLabel" runat="server"
Text='<%# Eval("UserName") %>' /> on
<asp:Label ID="CommentDateLabel" runat="server"
Text='<%# Eval("CommentDate") %>' />
</p>
</ItemTemplate>
<ItemSeparatorTemplate>
<hr />
</ItemSeparatorTemplate>
</asp:ListView>
LayoutTemplate
определяет разметку, порожденную элементом управления, в то время как ItemTemplate
отображает каждый элемент, возвращаемый SqlDataSource. Результирующая разметка ItemTemplate
помещается в элемент управления itemPlaceholder
LayoutTemplate
. В дополнение к itemPlaceholder``LayoutTemplate
включает элемент управления DataPager, который ограничивает ListView отображением всего 10 комментариев гостевой книги на страницу (по умолчанию) и отображает интерфейс разбиения по страницам.
В моем ItemTemplate
Тема комментария к каждой гостевой книге отображается в элементе <h4>
с текстом, расположенным под темой. Обратите внимание, что синтаксис, используемый для отображения текста, принимает данные, возвращаемые инструкцией Eval("Body")
DataBinding, преобразует их в строку и заменяет разрывы строк элементом <br />
. Это преобразование необходимо для отображения разрывов строк, введенных при отправке комментария, так как в HTML игнорируется пробел. Подпись пользователя отображается под текстом в курсиве, за которым следует домашний город пользователя, ссылка на свою домашнюю страницу, Дата и время внесения комментария, а также имя пользователя, который оставил комментарий.
Уделите время просмотру страницы в браузере. Вы должны увидеть комментарии, добавленные в книгу гостевой книги на шаге 5, показанном здесь.
Рис. 19. Guestbook.aspx
теперь отображает комментарии к гостевой книге (щелкните, чтобы просмотреть изображение с полным размером)
Попробуйте добавить новый комментарий в гостевую книгу. При нажатии кнопки PostCommentButton
страница отправляет обратно, и комментарий добавляется в базу данных, но элемент управления ListView не обновляется для отображения нового комментария. Это можно исправить одним из следующих.
- Обновление обработчика событий
Click
кнопкиPostCommentButton
для вызова методаDataBind()
элемента управления ListView после вставки нового комментария в базу данных или - Присвоение свойству
EnableViewState
элемента управления ListView значенияfalse
. Этот подход работает потому, что отключение состояния представления элемента управления требует повторной привязки к базовым данным при каждой обратной передаче.
На веб-сайте учебника, загружаемом из этого руководства, показаны обе методики. Свойство EnableViewState
элемента управления ListView для false
и код, необходимый для программной повторной привязки данных к ListView, содержится в обработчике событий Click
, но в него добавлен комментарий.
Note
В настоящее время страница AdditionalUserInfo.aspx
позволяет пользователю просматривать и изменять параметры домашнего города, домашней страницы и подписи. Может быть неплохо обновить AdditionalUserInfo.aspx
, чтобы отобразить комментарии к гостевой книге пользователя, вошедшего в систему. То есть, помимо проверки и изменения сведений, пользователь может посетить страницу AdditionalUserInfo.aspx
, чтобы увидеть, какие комментарии в гостевой книге были сделаны в прошлом. Я оставлю это в качестве упражнения для заинтересованного читателя.
Шаг 6. Настройка элемента управления CreateUserWizard для включения интерфейса для домашнего города, домашней страницы и подписи
SELECT
запрос, используемый Guestbook.aspx
страницей, использует INNER JOIN
для объединения связанных записей между GuestbookComments
, UserProfiles
и aspnet_Users
таблицами. Если пользователь без записи в UserProfiles
создает комментарий гостевой книги, комментарий не будет отображаться в ListView, так как INNER JOIN
возвращает только GuestbookComments
записи при наличии совпадающих записей в UserProfiles
и aspnet_Users
. И, как было показано на шаге 3, если у пользователя нет записи в UserProfiles
она не может просматривать или изменять ее параметры на странице AdditionalUserInfo.aspx
.
Нет необходимости говорить, что из-за наших решений по проектированию важно, чтобы каждая учетная запись пользователя в системе членства соответствовала записи в таблице UserProfiles
. Мы хотим, чтобы соответствующая запись была добавлена в UserProfiles
всякий раз, когда новая учетная запись пользователя членства создается с помощью CreateUserWizard.
Как обсуждалось в учебнике Создание учетных записей пользователей , после создания новой учетной записи членства элемент управления CreateUserWizard вызывает событиеCreatedUser
. Мы можем создать обработчик событий для этого события, получить UserId для только что созданного пользователя, а затем вставить запись в таблицу UserProfiles
со значениями по умолчанию для столбцов HomeTown
, HomepageUrl
и Signature
. Более того, можно запросить у пользователя эти значения, настроив интерфейс элемента управления CreateUserWizard для включения дополнительных текстовых полей.
Сначала рассмотрим, как добавить новую строку в таблицу UserProfiles
в обработчике событий CreatedUser
со значениями по умолчанию. После этого будет рассмотрена настройка пользовательского интерфейса элемента управления CreateUserWizard для включения дополнительных полей формы для получения домашнего города, домашней страницы и подписи нового пользователя.
Добавление строки по умолчанию вUserProfiles
В учебнике Создание учетных записей пользователей мы добавили элемент управления CreateUserWizard на страницу CreatingUserAccounts.aspx
в папке Membership
. Чтобы элемент управления CreateUserWizard мог добавить запись a в таблицу UserProfiles
при создании учетной записи пользователя, необходимо обновить функциональность элемента управления CreateUserWizard. Вместо того, чтобы вносить эти изменения на странице CreatingUserAccounts.aspx
, добавьте новый элемент управления CreateUserWizard на EnhancedCreateUserWizard.aspx
страницу и внесите изменения в этом руководстве.
Откройте страницу EnhancedCreateUserWizard.aspx
в Visual Studio и перетащите элемент управления CreateUserWizard с панели элементов на страницу. Задайте для свойства ID
элемента управления CreateUserWizard значение NewUserWizard
. Как мы обсуждали в учебнике Создание учетных записей пользователей , Пользовательский интерфейс по умолчанию CreateUserWizard запрашивает у посетителя необходимые сведения. После того как эти сведения предоставлены, элемент управления создает новую учетную запись пользователя в инфраструктуре членства, не требуя написания единой строки кода.
Элемент управления CreateUserWizard вызывает ряд событий во время рабочего процесса. После того, как посетитель предоставит сведения о запросе и отправит форму, элемент управления CreateUserWizard изначально вызывает событиеCreatingUser
. При возникновении проблемы во время процесса создания возникает событиеCreateUserError
. Однако если пользователь успешно создан, возникает событиеCreatedUser
. В учебнике Создание учетных записей пользователей мы создали обработчик события CreatingUser
, чтобы убедиться, что заданное имя пользователя не содержит начальных и конечных пробелов и что имя пользователя не отображается в пароле.
Чтобы добавить строку в таблицу UserProfiles
для только что созданного пользователя, необходимо создать обработчик событий для события CreatedUser
. К моменту запуска события CreatedUser
учетная запись пользователя уже создана в инфраструктуре членства, что позволяет нам получить значение UserId учетной записи.
Создайте обработчик событий для CreatedUser
события NewUserWizard
и добавьте следующий код:
protected void NewUserWizard_CreatedUser(object sender, EventArgs e)
{
// Get the UserId of the just-added user
MembershipUser newUser = Membership.GetUser(NewUserWizard.UserName);
Guid newUserId = (Guid)newUser.ProviderUserKey;
// Insert a new record into UserProfiles
string connectionString =
ConfigurationManager.ConnectionStrings["SecurityTutorialsConnectionString"].ConnectionString;
string insertSql = "INSERT INTO UserProfiles(UserId, HomeTown, HomepageUrl,
Signature) VALUES(@UserId, @HomeTown, @HomepageUrl, @Signature)";
using (SqlConnection myConnection = new SqlConnection(connectionString))
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand(insertSql, myConnection);
myCommand.Parameters.AddWithValue("@UserId", newUserId);
myCommand.Parameters.AddWithValue("@HomeTown", DBNull.Value);
myCommand.Parameters.AddWithValue("@HomepageUrl", DBNull.Value);
myCommand.Parameters.AddWithValue("@Signature", DBNull.Value);
myCommand.ExecuteNonQuery();
myConnection.Close();
}
}
Приведенный выше код существ, извлекая идентификатор UserId только что добавленной учетной записи пользователя. Это достигается с помощью метода Membership.GetUser(username)
для получения сведений о конкретном пользователе, а затем с помощью свойства ProviderUserKey
извлекается идентификатор пользователя. Имя пользователя, указанное пользователем в элементе управления CreateUserWizard, доступно через свойствоUserName
.
Затем строка подключения извлекается из Web.config
и указывается инструкция INSERT
. Создаются экземпляры необходимых объектов ADO.NET и выполняется команда. Код назначает DBNull
экземпляре для параметров @HomeTown
, @HomepageUrl
и @Signature
, которые влияют на вставку значений базы данных NULL
для полей HomeTown
, HomepageUrl
и Signature
.
Откройте страницу EnhancedCreateUserWizard.aspx
в браузере и создайте новую учетную запись пользователя. После этого вернитесь в Visual Studio и изучите содержимое таблиц aspnet_Users
и UserProfiles
(как мы делали на рис. 12). Вы должны увидеть новую учетную запись пользователя в aspnet_Users
и соответствующую строку UserProfiles
(со значениями NULL
для HomeTown
, HomepageUrl
и Signature
).
Рис. 20. Добавлены новая учетная запись пользователя и запись UserProfiles
(щелкните, чтобы просмотреть изображение с полным размером)
После того как посетитель предоставил сведения о новой учетной записи и нащелкнул кнопку «создать пользователя», создается учетная запись пользователя и строка, добавленная в таблицу UserProfiles
. Затем CreateUserWizard отображает его CompleteWizardStep
, в котором отображается сообщение об успешном выполнении и кнопка Continue (продолжить). Нажатие кнопки Продолжить приводит к выполнению обратной передачи, но никакие действия не выполняются, при этом пользователь зависает на странице EnhancedCreateUserWizard.aspx
.
Можно указать URL-адрес для отправки пользователю при нажатии кнопки continue через свойствоContinueDestinationPageUrl
элемента управления CreateUserWizard. Задайте для свойства ContinueDestinationPageUrl
значение «~/мембершип/аддитионалусеринфо.аспкс». После этого новый пользователь будет AdditionalUserInfo.aspx
, где он может просматривать и обновлять свои параметры.
Настройка интерфейса CreateUserWizard для запроса домашнего города, домашней страницы и подписи нового пользователя
Интерфейс по умолчанию элемента управления CreateUserWizard достаточно для сценариев создания простых учетных записей, где необходимо собирать только основные сведения об учетных записях пользователей, таких как имя пользователя, пароль и электронная почта. Но что делать, если мы хотели предложить посетителям ввести домашний город, домашнюю страницу и подпись при создании учетной записи? Можно настроить интерфейс элемента управления CreateUserWizard для получения дополнительных сведений при регистрации, и эти сведения можно использовать в обработчике событий CreatedUser
для вставки дополнительных записей в основную базу данных.
Элемент управления CreateUserWizard расширяет Управление мастером ASP.NET, то есть элемент управления, позволяющий разработчику страницы определить ряд упорядоченных WizardSteps
. Элемент управления мастера визуализирует активный шаг и предоставляет интерфейс навигации, позволяющий посетителю перемещаться по этим шагам. Элемент управления «Мастер» идеально подходит для разбиения длинной задачи на несколько коротких шагов. Дополнительные сведения об элементе управления Wizard см. в разделе Создание пошагового пользовательского интерфейса с помощью элемента управления мастера ASP.NET 2,0.
Разметка по умолчанию элемента управления CreateUserWizard определяет два WizardSteps
: CreateUserWizardStep
и CompleteWizardStep
.
<asp:CreateUserWizard ID="NewUserWizard" runat="server"
ContinueDestinationPageUrl="~/Membership/AdditionalUserInfo.aspx">
<WizardSteps>
<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
</asp:CreateUserWizardStep>
<asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
</asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
Первый WizardStep
, CreateUserWizardStep
, отображает интерфейс, запрашивающий имя пользователя, пароль, адрес электронной почты и т. д. Когда посетитель предоставит эти сведения и нажмет кнопку «создать пользователя», она отобразится CompleteWizardStep
, где отображается сообщение об успешном выполнении и кнопка продолжить.
Чтобы настроить интерфейс элемента управления CreateUserWizard для включения дополнительных полей формы, можно:
-
Создайте один или несколько новых
WizardStep
s, чтобы они содержали дополнительные элементы пользовательского интерфейса. Чтобы добавить новыйWizardStep
в CreateUserWizard, щелкните ссылку «Добавить/удалитьWizardSteps
» из смарт-тега, чтобы открыть редактор коллекцииWizardStep
. Здесь можно добавить, удалить или изменить порядок шагов в мастере. Это подход, который мы будем использовать в этом руководстве. -
Преобразуйте
CreateUserWizardStep
в редактируемыйWizardStep
. Это заменяетCreateUserWizardStep
эквивалентомWizardStep
, разметка которого определяет пользовательский интерфейс, соответствующийCreateUserWizardStep
. ПреобразуяCreateUserWizardStep
вWizardStep
можно изменить расположение элементов управления или добавить дополнительные элементы пользовательского интерфейса на этот шаг. Чтобы преобразоватьCreateUserWizardStep
илиCompleteWizardStep
в редактируемыеWizardStep
, щелкните ссылку «настроить создание пользователя шага» или «настроить полный шаг» в смарт-теге элемента управления. -
Используйте сочетание двух приведенных выше параметров.
Важно помнить, что элемент управления CreateUserWizard выполняет свой процесс создания учетной записи пользователя при нажатии кнопки «создать пользователя» в его CreateUserWizardStep
. Не имеет значения, есть ли дополнительные WizardStep
s после CreateUserWizardStep
или нет.
При добавлении пользовательского WizardStep
к элементу управления CreateUserWizard для получения дополнительных пользовательских данных пользовательский WizardStep
можно поместить до или после CreateUserWizardStep
. Если он находится перед CreateUserWizardStep
, то дополнительные входные данные пользователя, собранные из пользовательского WizardStep
, доступны для обработчика событий CreatedUser
. Однако если пользовательская WizardStep
находится после CreateUserWizardStep
затем на момент отображения настраиваемого WizardStep
, Новая учетная запись пользователя уже создана, а событие CreatedUser
уже запущено.
На рис. 21 показан рабочий процесс, когда добавленный WizardStep
предшествует CreateUserWizardStep
. Поскольку сведения о дополнительных пользователях были собраны в момент срабатывания события CreatedUser
, все, что нам нужно сделать, — это обновить обработчик событий CreatedUser
, чтобы получить эти входные данные и использовать их для значений параметров инструкции INSERT
(а не DBNull.Value
).
Рис. 21. Рабочий процесс CreateUserWizard, когда дополнительный WizardStep
предшествует CreateUserWizardStep
(щелкните, чтобы просмотреть изображение с полным размером)
Если пользовательская WizardStep
помещается после CreateUserWizardStep
, то процесс создания учетной записи пользователя происходит, прежде чем пользователь сможет ввести домашний город, домашнюю страницу или подпись. В этом случае эти дополнительные сведения необходимо вставить в базу данных после создания учетной записи пользователя, как показано на рис. 22.
Рис. 22. Рабочий процесс CreateUserWizard, когда после CreateUserWizardStep
поступает дополнительный WizardStep
(щелкните, чтобы просмотреть изображение с полным размером)
Рабочий процесс, показанный на рис. 22, ожидает вставки записи в таблицу UserProfiles
до завершения шага 2. Тем не менее, если посетитель закрывает свой браузер после шага 1, мы достигают состояния, в котором была создана учетная запись пользователя, но запись не была добавлена в UserProfiles
. Одним из возможных решений является запись со NULL
или значениями по умолчанию, вставленными в UserProfiles
в обработчике событий CreatedUser
(который срабатывает после шага 1), а затем обновляет эту запись после завершения шага 2. Это гарантирует, что запись UserProfiles
будет добавлена для учетной записи пользователя, даже если пользователь завершает процесс регистрации с самого посредине.
В этом руководстве мы создадим новый WizardStep
, который будет выполняться после CreateUserWizardStep
, но перед CompleteWizardStep
. Давайте сначала создадим WizardStep на месте и настроили, а затем рассмотрим код.
В смарт-теге элемента управления CreateUserWizard выберите «Добавить/удалить WizardStep
s», который открывает диалоговое окно Редактор коллекции WizardStep
. Добавьте новый WizardStep
, задав для его ID
значение UserSettings
, Title
для параметров и StepType
.Step
Затем поместите его таким образом, чтобы он поступил после CreateUserWizardStep
(«зарегистрироваться для создания новой учетной записи») и до CompleteWizardStep
(«Complete»), как показано на рис. 23.
Рис. 23. добавление нового WizardStep
в элемент управления CreateUserWizard (щелкните, чтобы просмотреть изображение с полным размером)
Нажмите кнопку ОК, чтобы закрыть диалоговое окно Редактор коллекции WizardStep
. Новый WizardStep
свидетельствует обновленная декларативная разметка элемента управления CreateUserWizard:
<asp:CreateUserWizard ID="NewUserWizard" runat="server"
ContinueDestinationPageUrl="~/Membership/AdditionalUserInfo.aspx">
<WizardSteps>
<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
</asp:CreateUserWizardStep>
<asp:WizardStep runat="server" ID="UserSettings" StepType="Step"
Title="Your Settings">
</asp:WizardStep>
<asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
</asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
Обратите внимание на новый элемент <asp:WizardStep>
. Чтобы получить домашний город, домашнюю страницу и подпись нового пользователя, необходимо добавить пользовательский интерфейс. Это содержимое можно ввести в декларативном синтаксисе или в конструкторе. Чтобы использовать конструктор, выберите в раскрывающемся списке в смарт-теге шаг «ваши параметры», чтобы просмотреть шаг в конструкторе.
Note
При выборе шага в раскрывающемся списке смарт-тега обновляется свойствоActiveStepIndex
элемента управления CreateUserWizard, которое указывает индекс начального шага. Поэтому, если вы используете этот раскрывающийся список для изменения шага «ваши параметры» в конструкторе, убедитесь, что для него установлен флажок «зарегистрироваться для использования новой учетной записи», чтобы этот шаг отображался при первом посещении пользователем страницы EnhancedCreateUserWizard.aspx
.
Создайте пользовательский интерфейс на шаге «Параметры», который содержит три элемента управления TextBox с именами HomeTown
, HomepageUrl
и Signature
. После создания этого интерфейса декларативная разметка CreateUserWizard должна выглядеть следующим образом:
<asp:CreateUserWizard ID="NewUserWizard" runat="server"
ContinueDestinationPageUrl="~/Membership/AdditionalUserInfo.aspx">
<WizardSteps>
<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
</asp:CreateUserWizardStep>
<asp:WizardStep runat="server" ID="UserSettings" StepType="Step"
Title="Your Settings">
<p>
<b>Home Town:</b><br />
<asp:TextBox ID="HomeTown" runat="server"></asp:TextBox>
</p>
<p>
<b>Homepage URL:</b><br />
<asp:TextBox ID="HomepageUrl" Columns="40" runat="server"></asp:TextBox>
</p>
<p>
<b>Signature:</b><br />
<asp:TextBox ID="Signature" TextMode="MultiLine" Width="95%"
Rows="5" runat="server"></asp:TextBox>
</p>
</asp:WizardStep>
<asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
</asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
Откройте эту страницу в браузере и создайте новую учетную запись пользователя, указав значения для домашнего города, домашней страницы и подписи. После завершения CreateUserWizardStep
учетная запись пользователя создается в инфраструктуре членства и запускается обработчик событий CreatedUser
, который добавляет новую строку для UserProfiles
, но с NULL
базы данных для HomeTown
, HomepageUrl
и Signature
. Значения, указанные для домашнего города, домашней страницы и подписи, никогда не используются. В результате получается новая учетная запись пользователя с записью UserProfiles
, для которой еще не заданы поля HomeTown
, HomepageUrl
и Signature
.
Необходимо выполнить код после шага «ваши параметры», который принимает значения домашнего города, хонепаже и сигнатуры, указанные пользователем, и обновляет соответствующую запись UserProfiles
. При каждом перемещении пользователя между шагами в элементе управления мастера срабатывает событиеActiveStepChanged
мастера. Мы можем создать обработчик событий для этого события и обновить таблицу UserProfiles
после завершения этапа «Параметры».
Добавьте обработчик событий для события ActiveStepChanged
CreateUserWizard и добавьте следующий код:
protected void NewUserWizard_ActiveStepChanged(object sender, EventArgs e)
{
// Have we JUST reached the Complete step?
if (NewUserWizard.ActiveStep.Title == "Complete")
{
WizardStep UserSettings = NewUserWizard.FindControl("UserSettings") as
WizardStep;
// Programmatically reference the TextBox controls
TextBox HomeTown = UserSettings.FindControl("HomeTown") as TextBox;
TextBox HomepageUrl = UserSettings.FindControl("HomepageUrl") as TextBox;
TextBox Signature = UserSettings.FindControl("Signature") as TextBox;
// Update the UserProfiles record for this user
// Get the UserId of the just-added user
MembershipUser newUser = Membership.GetUser(NewUserWizard.UserName);
Guid newUserId = (Guid)newUser.ProviderUserKey;
// Insert a new record into UserProfiles
string connectionString =
ConfigurationManager.ConnectionStrings["SecurityTutorialsConnectionString"].ConnectionString;
string updateSql = "UPDATE UserProfiles SET HomeTown = @HomeTown, HomepageUrl
= @HomepageUrl, Signature = @Signature WHERE UserId = @UserId";
using (SqlConnection myConnection = new SqlConnection(connectionString))
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand(updateSql, myConnection);
myCommand.Parameters.AddWithValue("@HomeTown", HomeTown.Text.Trim());
myCommand.Parameters.AddWithValue("@HomepageUrl", HomepageUrl.Text.Trim());
myCommand.Parameters.AddWithValue("@Signature", Signature.Text.Trim());
myCommand.Parameters.AddWithValue("@UserId", newUserId);
myCommand.ExecuteNonQuery();
myConnection.Close();
}
}
}
Приведенный выше код начинается с определения того, был ли достигнут шаг «завершено». Так как действие «завершено» происходит сразу после этапа «Параметры», когда посетитель достигает «завершенного» шага, это означает, что он только что завершил действие «параметры».
В этом случае нам нужно программно ссылаться на элементы управления TextBox в UserSettings WizardStep
. Для этого сначала используется метод FindControl
для программной ссылки на UserSettings WizardStep
, а затем снова сослаться на текстовые поля из WizardStep
. После ссылки на текстовые поля можно приступить к выполнению инструкции UPDATE
. UPDATE
ная инструкция имеет то же количество параметров, что и инструкция INSERT
в обработчике событий CreatedUser
, но здесь мы используем значения домашнего города, домашней страницы и подписи, предоставленные пользователем.
После создания этого обработчика событий перейдите на страницу EnhancedCreateUserWizard.aspx
в браузере и создайте новую учетную запись пользователя, указав значения для домашнего города, домашней страницы и подписи. После создания новой учетной записи необходимо перенаправить на страницу AdditionalUserInfo.aspx
, где отображаются только что введенные домашний город, Домашняя страница и подпись.
Note
В настоящее время наш веб-сайт содержит две страницы, на которых посетитель может создать новую учетную запись: CreatingUserAccounts.aspx
и EnhancedCreateUserWizard.aspx
. Страница веб-сайта и имя входа указывают на страницу CreatingUserAccounts.aspx
, но страница CreatingUserAccounts.aspx
не запрашивает у пользователя домашний город, домашнюю страницу и сведения о подписи и не добавляет соответствующую строку в UserProfiles
. Поэтому обновите страницу CreatingUserAccounts.aspx
таким образом, чтобы она предложит эту функцию, или обновите карту сайта и страницу входа в справочные EnhancedCreateUserWizard.aspx
вместо CreatingUserAccounts.aspx
. При выборе второго варианта не забудьте обновить файл Web.config
папки Membership
, чтобы разрешить анонимным пользователям доступ к странице EnhancedCreateUserWizard.aspx
.
Сводка
В этом учебнике мы рассматривали методы моделирования данных, связанных с учетными записями пользователей в инфраструктуре членства. В частности, мы рассматривали моделирование сущностей, которые совместно используют связь «один ко многим» с учетными записями пользователей, а также с данными, которые совместно используют связь «один к одному». Кроме того, мы увидели, как можно отобразить, вставить и обновить эту связанную информацию, с некоторыми примерами с помощью элемента управления SqlDataSource и других пользователей, использующих код ADO.NET.
Этот учебник завершает наш взгляд на учетные записи пользователей. Начиная со следующего учебного курса, мы будем приносим внимание к ролям. В следующих нескольких учебных курсах рассматривается инфраструктура ролей, приведены инструкции по созданию ролей, назначению ролей пользователям, определению ролей, к которым принадлежит пользователь, и применению авторизации на основе ролей.
Поздравляем с программированием!
Дополнительные материалы
Дополнительные сведения о разделах, обсуждаемых в этом руководстве, см. в следующих ресурсах:
- Доступ к данным и их обновление в ASP.NET 2,0
- Элемент управления мастера ASP.NET 2,0
- Создание пошагового пользовательского интерфейса с помощью элемента управления мастера ASP.NET 2,0
- Создание пользовательских параметров элемента управления DataSource
- Настройка элемента управления CreateUserWizard
- Краткие руководства по элементу управления DetailsView
- Отображение данных с помощью элемента управления ListView
- Которая разбила элементов управления проверки в ASP.NET 2,0
- Изменение операций вставки и удаления данных
- Проверка формы в ASP.NET
- Сбор настраиваемых сведений о регистрации пользователя
- Профили в ASP.NET 2,0
- Элемент управления ASP: ListView
- Краткое руководство по профилям пользователей
Об авторе
Скотт Митчелл, автор нескольких книг по ASP/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями Майкрософт с 1998. Скотт работает как независимый консультант, преподаватель и модуль записи. Его последняя книга — Sams обучать себя ASP.NET 2,0 за 24 часа . Скотт можно получить по адресу mitchell@4guysfromrolla.com или через свой блог по адресу http://ScottOnWriting.NET.
Особая благодарность…
Эта серия руководств была рассмотрена многими полезными рецензентами. Хотите ознакомиться с моими будущими статьями MSDN? Если это так, расположите строку в mitchell@4GuysFromRolla.com.
Самой дорогой ошибкой в истории, вызванной неправильными исходными данными, считается авария ракеты Ариан-5. Суммарный урон по итогу этого случая оценивают в 0.5 миллиардов долларов в ценах начала 1996 года.
Ещё одной, возможно, самой курьёзной, стала ошибка в огромном заказе от французских железных дорог SNCF на 2 тыс. поездов в 2014 году. Команда, которая формировала технические требования, собственноручно провела замеры габаритов перронов на нескольких десятках станций. Желая увеличить комфорт, они задали ширину составов впритык к максимальной. Измерения они проводили в окрестностях Парижа — и о том, что в регионах на многих станциях перроны находятся ближе к путям, узнали уже при испытаниях. Цена ошибки — модернизация всей инфраструктуры на сотни миллионов евро. Им бы там MDM с характеристиками станций…
Следом идёт огромное количество биржевых и банковских ошибок, когда неправильные данные в реквизитах, в цифрах и стоимости размещаемых акций приводили к миллиардным потерям или даже к банкротству.
Эта статья продолжает статью «мастер-данные и интеграция» — и более подробно освещает вопрос контроля качества данных, в первую очередь — мастер-данных. Статья будет особенно интересна руководителям IT, архитекторам, интеграторам, а также всем, кто работает в достаточно крупных компаниях.
Содержание
1. Словарь, виды бизнес-данных: мастер-данные, нормативно-справочная информация, операционные данные.
2. Коротенько о том, какие бывают ошибки.
3. Архитектура решений DQS.
4. Технические и нетехнические приёмы борьбы с ошибками:
4.1. НСИ.
4.2. Мастер-данные.
4.3. Операционка.
5. Что делать, когда ничего из перечисленного не помогло — внедрять DQS.
6. И как делить ответственность?
Если терминология и проблематика вам уже знакомы, переходите сразу к части 3, про архитектуру DQS.
1. Словарь, виды бизнес-данных
Уже пару десятков лет IT-евангелисты убеждают нас, что данные — новая нефть. Что любой бизнес всё больше зависит от обладаемой информации. Аналитические и дата-отделы появляются не только в IT-компаниях, но и в максимально далёких от «цифры» индустриальных и промышленных отраслях.
Многим уже набил оскомину пример того, как компании General Electric и Boeing создают «цифровых» дочек и зарабатывают на огромном объёме информации, собираемой от владельцев их техники — самолётов, турбин, электростанций. Эти данные позволяют им повышать надёжность техники, предсказывать возможные отказы, сильно экономя на потенциальном ущербе, наконец, просто спасать жизни людей!
Данных становится всё больше, и накопление их нелинейно зависит от роста бизнеса, рост опережающий. Любая растущая компания на определенном этапе своего развития (примерно на 6-7 уровне по шкале из прошлой статьи) сталкивается с проблемами некорректных данных, и обязательно происходит несколько случаев, когда цена этих ошибок оказывается достаточно высокой.
Традиционная картинка про рост объёма данных — почти всегда экспонента.
По ходу деятельности особую важность для компании представляют собой три вида данных:
- мастер-данные — это информация, которая должна быть единой и синхронизированной во всех местах организации, во всех информационных системах. Это список клиентов компании, перечень товаров и услуг (со всеми дополнительными реквизитами: цена, категория, условия), организационная структура компании, персонал, имущество и т.д.;
- нормативно-справочная информация (НСИ) — это понятие близко к мастер-данным, и во многих компаниях объединяется с ними. Разница в том, что эти данные существуют независимо от вашей компании: список (классификатор) стран мира, адресный классификатор, реестры банков, курсы валют;
- операционные (они же транзакционные) данные — факт продажи конкретного товара конкретному клиенту, счета и акты, пройденные курсы, заказы курьеров и поездки на такси — в зависимости от того, чем занимается ваша компания.
Если НСИ можно сравнить с несущим скелетом, мастер-данные — с венами и артериями, то операционка — это кровь, которая бежит по этим венам.
Разграничение видов бизнес-данных нужно по той причине, что для каждого будет свой подход к работе над ошибками, про это ниже.
2. Коротенько о том, какие бывают ошибки
Ошибки неизбежны, они возникают всегда и везде, и, видимо, отражают хаотическую природу самого мироздания. Можно считать их чем-то плохим, расстраиваться из-за них, но, задумайтесь: ошибки лежат в основе эволюции! Да, каждый следующий вид — это предыдущий с несколькими случайными ошибками в ДНК, только последствия этих ошибок при определенных условиях оказались полезными.
Основные виды ошибок, от которых страдает бизнес:
- человеческий фактор. Опечатки всех видов, перепутанные поля и не туда внесённая информация. Забытые или случайно пропущенные действия и шаги при её внесении (у вас ведь тоже в карточке клиента по 50 полей?) Статически это самый вероятный вид ошибок, поэтому частота и эффект от них может оказаться самым большим. К счастью, для борьбы с ними придумано и самое большое количество методов;
- неполнота информации. Говорят, что полуправда хуже неправды, и в бизнесе это часто бывает критичным. Например, вы заключили крупный контракт с организацией — и через некоторое время узнали, что в отношении руководства компании ведётся судопроизводство. Ваш контрагент может уклоняться от налогов или, чего хуже, заниматься противозаконной деятельностью. Через некоторое время с вами свяжутся… конечно, ваш бизнес полностью легален, но кого обрадуют лишние проверки? А как хорошо было бы, если бы тогда, при нанесении контрагента в базу, ваша учётная система или CRM предупредила бы: внимание! Контрагент не прошёл проверку на благонадёжность!
- сознательные ошибки. Сотрудник умышленно перевёл себе несколько миллионов — и пропал. Это, конечно, экстремальный пример, криминал, но по дороге к нему есть немало шагов. Например, одному из клиентов в CRM назначена незаслуженно высокая скидка или стоимость товара установлена ниже себестоимости.
И если третье — это предмет работы службы информационной безопасности, там есть свои методы, то с человеческим фактором и неполнотой мы поработаем предметно.
3. Архитектура решений DQS
DQM — data quality management, управление качеством данных.
DQS — data quality system, система [управления] качеством данных.
Перед тем, как рассказать непосредственно о системах управления качеством данных (DQS — это не столько конкретное программное обеспечение, сколько подход к работе с данными), опишу IT-архитектуру.
Обычно, к тому моменту, когда возникает вопрос управления качеством данных, IT-ландшафт представляет собой следующее:
(схема из предыдущей статьи)
Где MDM — система для ведения мастер-данных и нормативки, а ESB — единая шина данных предприятия. Часта ситуация, когда не все данные и потоки информации между системами пока ещё вовлечены в общий контур, и некоторые системы общаются напрямую друг с другом — с этим нужно будет поработать, иначе ряд процессов будет «слепой зоной» для DQS.
Традиционно на первом этапе DQS подключается к системе MDM, поскольку управление качеством мастер-данных считается более приоритетным, чем операционки. Однако, в дальнейшем она включается в общую шину данных как один из этапов процессов, либо представляет свои «услуги» в формате API. В конкретных цифрах между первой и второй схемой примерно десятикратная разница в объёме данных или один уровень по шкале из прошлой статьи.
4. Технические и нетехнические приёмы борьбы с ошибками.
В следующем предложении будет написана самая грустная мысль этой статьи. Серебряной пули не существует. Нет такой кнопки или системы, которую поставишь — и ошибки пропадут. И вообще, у этой сложной проблемы нет простого и однозначного решения. То, что прекрасно подходит для одного вида или набора данных, будет бесполезным для другого.
Однако, есть и хорошая новость: набор технических и организационных методов, описанных в этой статье ниже, позволит значительно сократить количество ошибок. Компании, внедряющие подход DQM, сокращают количество выявленных ошибок в 50-500 раз. Конкретная цифра — это результат разумного баланса между эффектом, затратами и удобством работы.
4.1. Нормативно-справочная информация.
В случае нормативно-справочной информации (по сути, государственных классификаторов) есть максимально категоричное решение, и оно универсальное: вы не должны вести нормативку самостоятельно! Никогда, не при каких обстоятельствах!
Нормативка всегда и строго должна загружаться из внешних источников, а ваша главная задача — реализовать такую загрузку и наладить оперативный мониторинг на случай сбоев.
Пример #1. Наверняка вам для работы понадобится список стран мира. На него будут ссылаться многие другие справочники: контрагенты и клиенты (страна регистрации), валюты (курс какой страны), ваша география (в какой стране и по какому адресу расположен офис).
Значит, любая сущность, которая содержит в себе страну мира (даже если вы в ней выбираете из двух-трёх стран) должна ссылаться на этот справочник. А сам справочник должен заполняться строго на основании официальных классификаторов, в случае РФ — это ОКСМ (общероссийский классификатор стран мира).
Если вы работаете на международном рынке, обратите внимание на нюанс: в разных странах разное представление о странах мира и их количестве. И речь не только про такие частично-признанные республики, как Абхазия или Южная Осетия. Например, около двадцати стран не признают существование Израиля и Китайской Народной Республики. Есть и точечные непризнания на территории СНГ, например, Армения не признаётся… Пакистаном.
Страны мира (в РФ это и ниже — ОКСМ), валюты (ОКВ), виды экономической деятельности (ОКВЭД), адреса (ФИАС), банки и их счета, клиенты и поставщики (ЕГРЮЛ и ЕГРИП) — эта и множество другой информации публикуется государственными органами практически всех стран в виде открытых API и сервисов, и она должна загружаться только таким образом.
По итогу этих мер ни в одном месте вашей компании никому не должна прийти в голову мысль ввести, например, курс доллара к рублю на вчера вручную. Только выбор из справочников, загружаемых из официальных источников.
Категоричность этого пункта вызвана тем, что его выполнение снимает практически все ошибки в нормативке. И если в мастер-данных ошибки полностью побороть невозможно, то в НСИ таким образом можно сократить количество ошибок до одной-двух в год — и это будут уже не ваши ошибки, а ошибки в государственных данных.
4.2. Мастер-данные
Главная стратегия в отношении мастер-данных прозвучит, возможно, парадоксально: превращайте их в нормативку!
Пример #2. Справочник контрагентов — юридических лиц и ИП, являющихся вашими клиентами или поставщиками (в компаниях уровня выше 5-6 — часто одновременно и тем, и тем).
Какой бы набор полей вы не решили добавить в справочник контрагентов в систему MDM, ваша цель такова: все данные должны заполняться автоматически, с поиском по одному из естественных полей. В случае контрагентов РФ — это наименование или ИНН.
Это не значит, что вы должны занести в свой справочник контрагентов все несколько миллионов записей из открытых данных. Но новые записи должны добавляться как раз на их основании. Базовые реквизиты можно взять с сайта налоговой. Если вас интересуют данные бухгалтерской отчётности или среднесписочной численности (например, в целях аналитики, развивать отношения с наиболее крупными клиентами) — берите их у Росстата. Если у вас есть процедура проверки на благонадёжность — берите данные с сайтов соотв. служб с помощью своей ИТ-команды, либо есть вариант покупать уже подготовленные и выверенные данные у провайдеров (например, СПАРК-Интерфакс). Цена вопроса, сотни тысяч рублей в год, при ваших масштабах окупается за несколько месяцев.
Самое главное, что проблему неактуальных реквизитов и потенциально нежелательных контрагентов вы решите полностью. Правда, в каждой стране присутствия её нужно решать отдельно.
Пример #3. Физические лица, сотрудники вашей компании. Ошибки в паспортных данных, неправильные ФИО и дата рождения, СНИЛС. Сокрытая информация о судимости, просроченной задолженности перед госорганами, алиментах.
Список сотрудников почти всегда является мастер-данными в крупных компаниях. Как их сделать нормативкой? Самый простой способ — наладить интеграцию с порталом Госуслуг. Возможен также вариант авторизации на ваших сервисах через портал Госуслуг. Ключевое слово для поиска: ЕСИА. Нужно будет обзавестись рядом сертификатов, но при ваших масштабах и уровне развития это не составит проблем.
Естественным продолжением этой истории будет электронный кадровый документооборот — электронная трудовая книжка, электронные больничные и др., что значительно сэкономит трудозатраты у кадровиков. В пределе это позволит одному кадровику обслуживать не 200-300 сотрудников, а 1000+.
Также все сотрудники автоматом получают электронные ключи-подписи — и смогут использовать их как во внутренних бизнес-процессах, так и при документообороте с клиентами.
Информация о задолженностях, судимостях и т.д. доступна в открытом виде через API соотв. госслужб, интеграция с ними предельно простая, и позволит вашей компании закрыть сразу большое количество рисков.
4.3. Операционка
Здесь подходов уже больше. Первый аналогичен предыдущему — подключать внешние источники информации.
Пример #4. — Хорошо, — скажете вы, — контрагенты и физлица — это просто. Но что делать с более бизнес-специфичными процессами и данными? Искать государственные классификаторы и другие гарантированные источники этой информации.
Попробуем разобрать точечный пример. У вас есть парк автомобилей. Не обязательно, что вы — служба такси, в любой достаточно крупной компании будет техника для служебных нужд. Вам нужно наладить учёт этих автомобилей, заправок и поездок, т.е. учёт расходов.
Создаём справочник автомобилей — это мастер-данные. Модель автомобиля, его нормы расхода топлива и характеристики выбираем из гос. классификатора моделей (не забывайте настроить регулярную интеграцию, чтобы данные не устаревали!)
Информацию о конкретном автомобиле заполняем строго по госномеру на основании подключаемого справочника (например, Автокод).
Откуда получить информацию, что конкретный водитель заправился на такую-то сумму в такой-то день? Оформить топливные карты (они стоят денег, но быстро окупят себя за счёт накопительной скидки) — и забирать данные у провайдера топливных карт в автоматическом режиме. Конечно, сам список топливных карт в этом случае станет мастер-данными, но вестись он будет автоматически, на основании данных провайдера.
Пример #5. Командировки сотрудников: билеты, гостиницы и прочие расходы.
Для билетов и гостиниц — пользоваться агрегаторами, все они позволяют, во-первых, значительно экономить на организации поездок (цены на билеты, гостиницы). Во-вторых, дают API со всей возможной информацией, вплоть до ЭДО. По всем прочим расходам — пользоваться электронными чеками, они уже принимаются везде. Т.е. человеческий фактор будет если не исключён, то сведён к минимуму.
Да, не во всех процессах получится быстро найти необходимые источники информации, потребуется поиск и аналитика. Также источники могут оказаться платными, и дальше происходит взвешивание плюсов и минусов, но подход рабочий и многократно проверенный на практике.
Информация (данные) — новая нефть, и все государства стремятся к тому, чтобы получить максимально возможный объем информации о своих субъектах, включая бизнес, обо всех процессах, в которых они участвуют.
Нам даже тяжело представить, какую информацию государство собирает, могу сказать только, что на момент написания этой статьи на портале открытых данных России представлено около 20 тысяч наборов данных. И Россия только в начале этого пути, так, на аналогичном портале Евросоюза доступно больше миллиона наборов открытых данных!
www.europeandataportal.eu/en
— Где же здесь DQS, — спросит внимательный читатель?
А про неё ещё ничего и не было.
Всё вышеперечисленное — это, по сути, стандартные инструменты и методы для организации бизнес-процессов с минимальным количеством ошибок.
5. Что делать, когда ничего из перечисленного не помогло — внедрять DQS
Сунь-цзы учит, что лучшая битва — та, которую удалось избежать.
Ситуация с внедрением DQS чем-то похожа.
Ваша задача — постараться по максимуму превращать мастер-данные и даже операционку в НСИ, и в некоторых отраслях, особенно в сфере услуг, это возможно почти на 100%. Больше всего в банковской сфере, поэтому в ней степень автоматизации бизнес-процессов куда больше, чем у многих других.
Тем не менее, если битву избежать не получается, к ней нужно максимально правильно подготовиться.
На каком уровне развития компании нужно вводить DQS? Как процесс DQM — на 4-5 (раньше MDM-системы!), как организационно выделенную функцию — на 7-8.
5.1. DQM как процесс
Если у вас в компании есть бухгалтерская или кадровая система, то и процесс DQM в каком-то виде у вас будет. Во все эти системы встроен определённый набор правил для вводимых данных. Например, обязательность и строгий формат даты рождения для сотрудника, обязательность наименования для контрагентов.
Ваша задача на данном этапе будет заключаться в выстраивании процесса DQM. Он следующий:
- придумать правило;
- протестировать правило на применимость и адекватность, обкатать на кейсах;
- разработать регламент применения правила, провести коммуникацию с пользователями, обосновать;
- внедрить в продакшн;
- следить за попытками обхода правила.
Если вы сумели внедрить в компании MDM, значит, пункты со второго и далее не должны вызвать у вас особых затруднений, это текущая планомерная работа.
Наибольшие затруднения в таком случае возникают с придумыванием новых правил.
5.2. Правила
Если для такой сущности, как ФИО, ваша фантазия ограничивается обязательностью фамилии и имени, а для даты — проверкой на “не больше ста лет”, не расстраивайтесь!
Существует шикарная методика разработки новых правил для проверки самых невообразимых данных. Для её освоения не нужно быть семи пядей во лбу — и, как показывает практика, её в состоянии освоить любой начинающий системный или бизнес-аналитик, даже операторы по вводу мастер-данных.
По сути, это пошаговый скрипт, у которого на входе определение ваших данных, а на выходе — набор правил на все случаи жизни. Методика, известная под названием “таксономия грязных данных”, была разработана группой европейских data-scientist’ов в начале XXI века.
Суть подхода, а также практические примеры приведены в их системной статье, к счастью, уже опубликованной в переводе здесь, на Хабре — habr.com/ru/post/548164
Если проблема качества данных для вас — не пустой звук, то после вдумчивого прочтения той статьи вы обнаружите себя в состоянии, близком к достижению нирваны
Пример #6. Строгая типизация. Если в справочнике используется тип данных “дата”, то структура даты должна быть максимально явной. Если вы решили сэкономить две секунды для операторов, и сделали шаблон вида “__.__.__” с подсказкой “день, месяц, год”, будьте уверены, что в первый же день появятся записи “18.04.21”, “21.04.18” и “04.18.21”.
Хорошим способом ввода даты являются три поля с явным обозначением (день, месяц, год) и быстрым переходом при вводе двух цифр в каждом из полей. Если вы хоть раз платили за что-нибудь картой в интернете, поймёте.
Пример #7. Запрещённые символы в максимально широком списке полей, словарные проверки. Например, если речь идёт про образование (должность), и классификаторы специальностей не помогли, вы позволяете пользователю ввести данные в текстовом поле, пусть там будут запрещены точки, кавычки, отдельно стоящие чёрточки (список не полный). Пример информации, качество которой повышается: “доктор технических наук”, “д.т.н.”, “ДТН”, “д-р техн. наук” и т.д.
Пример #8. Пустое и неуказанное значение (NULL) — это два разных значения. Например, неуказанное высшее образование/отсутствие высшего образования, неуказанное отчество/отсутствие отчества — разница велика, и она должна быть зафиксирована в явном виде. Хороший пример реализации — сайты по продаже билетов справа от отчества размещают галочку “нет отчества”.
Кстати, про ФИО, и особенно про отчество. Если вы предполагаете работу с физическими лицами из стран Средней Азии или Ближнего Востока, кейсы с “ибн”, “бен”, “кызы”, “оглы” (и др.) могут стать критичными в вопросах качества данных, например, при поиске дубликатов. Аналогичная история с порядком употребления этих данных (“Джон Смит”, “Смит, Джон”) и с двойными именами (“Анна Мария”, “Анна-Мария”, “Джон Чарльз Смит”). Также для многих не иметь фамилию — это нормально. А ещё, с точки зрения одних, “Наталья” и “Наталия” — разные имена, а с точки зрения других — одинаковые. А ещё есть “сэр”, “доктор”…
Имя человека, на самом деле, отличный пример. Правил и исключений в именах настолько много, что лучшим выходом из ситуации будет не изобретать собственный велосипед, а подключить одну из готовых библиотек, содержащих в себе заведомо большое количество кейсов.
6. Кто несёт ответственность за DQS?
В вопросах управления и ответственности правильных ответов не бывает, скорее всё зависит от конкретных команд и личностей. Инженер-ракетчик может быть главным бухгалтером, художник — финансовым директоров, а учительница начальных классов — руководителем службы охраны.
Вопрос про ответственность за процесс DQM, на самом деле, даже более общий: кто несёт ответственность за качество данных в компании? Традиционно бизнес-пользователи и IT-департамент в ответе на этот вопрос выступают антагонистами.
Бизнес часто начинает диалог с утверждения “мы заметили ошибку в вашей системе мастер-данных”.
Служба IT, напротив, считает, что её задача — обеспечить бесперебойную работу систем, а какие конкретно данные бизнес-пользователи вводят в систему — это зона ответственности бизнеса.
Выстраивание работающего процесса DQM и запуск DQS является тем самым компромиссом, удовлетворяющим обе стороны. Задача IT и аналитиков заключается в разработке максимально возможного количества правил и ограничений для вводимых данных, чтобы свести риск возникновения ошибки к минимуму.
Позиция “бизнеса”, как правило, вызвана отсутствием прозрачности в процессах DQM. Однако, если свести его до наглядной демонстрации ошибки, позиция смягчается. И может дойти до согласия в случае демонстрации последствий тому, кто вводит первичные данные.
Восхитительнейший пример и мотивацией и даже визуализацией последствий ошибок приведён в статье habr.com/ru/post/347838 — в этом примере ответственным за процесс DQM выступает служба IT с развитыми компетенциями бизнес-анализа. Причём сами по себе компетенции в DQM не сложны, и могут быть развиты у любого аналитика за пару месяцев.
Ещё один пример, интересный тем, что в процесс DQM включено также управление качеством бизнес-процессов, приведён в статье habr.com/ru/company/otus/blog/526174.
Итоги
Общие выводы из этой статьи парадоксальны.
Если в вашей компании был задан вопрос “кто несёт ответственность за качество данных”, то вы попали в ловушку. На него нет правильного ответа, т.к. сам вопрос неправильный. Если вы попробуете сходить по этому пути, со временем поймёте, что единственный подходящий ответ на этот вопрос (“все”) ничего не даст вам на практике.
Правильный подход — разделение вопроса на два блока.
Первый — выстраивание DQM как процесса, внедрение DQS, формирование правил (не на разовой основе, а как постоянно идущий процесс). Этот блок живёт там, где сильны функции анализа, обычно, в IT, но необязательно.
Второй блок — сам ввод первичных данных — это место, где принимаются решения о конкретных данных, но не наобум, а на основании всех правил. Таким образом, внедрение DQS — важный шаг в сторону data driven company.
Приглашаю к дискуссии!
Для помощи при подготовке плана хода и содержания беседы с детьми учащимися в школе, педагогическим коллективом на темы «Борьба с коррупцией», «Противодействие коррупции» представляю Вам образцы информационно-методического материала из практического опыта работы преподавателей начальных и средне образовательных школ и учреждений.
Беседа “Коррупция в современном обществе”
Цели:
- Познакомить с понятием «коррупция», с формами проявления коррупции, ее последствиями.
- Расширять кругозор учащихся, формировать собственное мировоззрение на проблемы современного общества, способствовать становлению устойчивой позиции по предупреждению коррупционных проявлений в стране.
- Воспитывать ответственность за собственные действия и поступки, сознательность и социальную активность подрастающей молодежи.
Ход классного часа:
Приходилось ли вам слышать это слово?
“Снежный ком” (мозговой штурм)
Слепим «снежный ком» о понятии «коррупция».
Какие ассоциации возникают у вас со словом «коррупция»? (взятка, подкуп, обман, мошенничество).
Коррупция (от лат. corruptio – подкуп) – процесс, связанный с прямым использованием должностным лицом прав, связанных с его должностью, в целях личного обогащения (подкуп чиновников и общественно- политических деятелей, дача взяток и т. д.).
Если сказать своими словами: злоупотребление должностным положением с целью получения личной выгоды.
Исторические корни коррупции, вероятно, восходят к обычаю делать подарки, чтобы добиться расположения. Дорогой подарок выделял человека среди других просителей и способствовал тому, чтобы его просьба была выполнена. Поэтому в первобытных обществах плата жрецу или вождю была нормой. По мере усложнения государственного аппарата и усиления власти центрального правительства, появились профессиональные чиновники, которые, по замыслу правителей, должны были довольствоваться только фиксированным жалованием. На практике чиновники стремились воспользоваться своим положением для тайного увеличения своих доходов.
Чаще всего под коррупцией подразумевают получение взяток, незаконных денежных доходов, государственными бюрократами, которые вымогают их у граждан ради личного обогащения.
Однако в более общем смысле слова участниками коррупционных отношений могут быть не только государственные чиновники, но и, например, менеджеры фирм; взятки могут давать не деньгами, а в иной форме; инициаторами коррупционных отношений часто выступают не госчиновники, а предприниматели.
К сферам деятельности, которые в наибольшей степени подвержены коррупции в России, относятся:
- Таможенные службы;
- Медицинские организации;
- Автоинспекции;
- Судебные органы;
- Налоговые органы;
- Правоохранительные органы;
- Получение кредитов;
- Надзор за соблюдением правил охоты и рыболовства;
- Освобождение от призыва на военную службу;
- Поступление в ВУЗы и многие др.
Виды коррупции
Бытовая коррупция порождается взаимодействием рядовых граждан и чиновников. В неё входят различные подарки от граждан и услуги должностному лицу и членам его семьи.
Деловая коррупция возникает при взаимодействии власти и бизнеса. Например, в случае хозяйственного спора, стороны могут стремиться заручиться поддержкой судьи с целью вынесения решения в свою пользу.
Коррупция верховной власти относится к политическому руководству и верховным судам в демократических системах. Она касается стоящих у власти групп, недобросовестное поведение которых состоит в осуществлении политики в своих интересах и в ущерб интересам избирателей (что происходит сегодня на Украине, когда покупаются места в Верховной раде, вместо того, чтобы быть избранным народом).
Коррупция в вузах. Высшая школа сегодня представляет собой гигантский теневой рынок, на котором крутятся миллиарды. Диплом на этом рынке стал чуть ли не финансовым документом. Он покупается, чтобы в дальнейшем определять цену работника на рынке труда. При этом мы имеем дело с рынком, на котором покупатель абсолютно бесправен, а продавец искусственно создает дефицит товара. Количество бесплатных мест в вузах постоянно сокращается, платных — увеличивается. И это притом, что и «бесплатные» студенты должны платить.
Для общества коррупция стала одной из острейших проблем. Ежедневно в СМИ мы слышим о коррупции, взяточничестве. Это негативное явление пронизало всё общество. Практически каждый житель нашей страны так или иначе столкнулся с этим явлением. К сожалению, коррупция становится нормой, население приспособилась к подаркам и штрафам без квитанций.
Как, по – вашему мнению, ребята, надо ли бороться с коррупцией?
В истории России были разные периоды равного наказания и того, кто подкупает и кого подкупают. Петр I определял наказание лицам дающим взятку наравне с получившим взятку “…чинить велено смертную казнь, без всякой пощады”. Такой подход отмечается и за рубежом, например, в современной Японии.
Несмотря на принимаемые жёсткие меры по борьбе с коррупцией, всё ещё много чиновников продолжают брать взятки.
В Уголовном кодексе РФ есть статьи № 285 «Злоупотребление должностными полномочиями», №290 «Получение взятки», № 291 «Дача взятки».
Иногда чиновники вымогают взятку. Это так и называется: «вымогательство», и за это судят. Но в школьной среде тоже иногда случаются факты вымогательства отдельными учениками денег у своих сверстников или у школьников, младших по возрасту. Это тоже наказывается.
Как вы думаете, какие меры помогли бы нашему правительству бороться с коррупцией?
- Повышение заработной платы работников правоохранительных органов, образования, медицины, с тем, чтобы им никогда не пришло в голову брать взятку. Это будет возможно тогда, когда у людей будет достойная зарплата.
- Сделать так, чтобы чиновникам было невыгодно брать взятку, и не было бы для этого никакой возможности;
- Раз и навсегда запрещать работать с людьми лицам, которые хотя бы один раз были замечены в получении взятки;
- Ужесточить законы страны в отношении коррупционеров, чтобы страх перед наказанием был сильнее соблазна;
- Воспитывать в людях внутренний регулятор под названием совесть.
Как видите, бороться с коррупцией можно. Если давать отпор коррупционерам и взяточникам.
Скоро вы станете взрослыми, вам придётся решать многие вопросы, которые ставит перед нами жизнь. Постарайтесь найти верное решение в любой ситуации, не обходя закон.
Источник и ссылка для скачивания документа в формате doc
Беседа с педагогическим коллективом “Что такое коррупция, чем она питается?”
Беседа с педагогическим коллективом ОГКУ ДО СДЮСШОР
Международный день борьбы с коррупцией объявлен ООН 9 декабря 2003 года в день открытия для подписания Конвенции ООН против коррупции (впервые был отмечен 9 декабря 2004 года). Тогда в Мексике открылась всемирная конференция, посвященная подписанию Конвенции ООН против коррупции. В течение трех дней подпись под этим новым международным документом поставили представители 100 государств мира. Конвенция против коррупции была одобрена Генеральной Ассамблей ООН 31 октября 2003 года. Цель Конвенции – предупреждение и искоренение коррупции. ООН считает, что она подрывает экономическое развитие, ослабляет демократические институты и принцип верховенства закона, нарушает общественный порядок и разрушает доверие общества, тем самым давая возможность процветать организованной преступности, терроризму и другим угрозам безопасности человека.
В марте 2006 года Конвенция ООН против коррупции была ратифицирована в России (Россия стала 47-й страной, ратифицировавшей документ). Как подчеркнул в выступлении на форуме глава российской делегации замминистра иностранных дел РФ Алексей Мешков, «Россия ведет с коррупцией бескомпромиссную борьбу и готова к конструктивному взаимодействию на антикоррупционном фронте со всеми государствами и соответствующими международными организациями».
Президентом РФ Д. А. Медведевым 31 июля 2008г. утвержден Национальный план противодействия коррупции. В документе констатируется, что: «Несмотря на предпринимаемые меры, коррупция, являясь неизбежным следствием избыточного администрирования со стороны государства, по-прежнему серьёзно затрудняет нормальное функционирование всех общественных механизмов, препятствует проведению социальных преобразований и повышению эффективности национальной экономики, вызывает в российском обществе серьёзную тревогу и недоверие к государственным институтам, создаёт негативный имидж России на международной арене и правомерно рассматривается как одна из угроз безопасности Российской Федерации».
Коррупция (от лат. corrumpere – «растлевать») — не юридический термин, обозначающий обычно использование должностным лицом своих властных полномочий и доверенных ему прав в целях личной выгоды, противоречащее установленным правилам (законодательству). Наиболее часто термин применяется по отношению к бюрократическому аппарату и политической элите. Соответствующий термин в европейских языках обычно имеет более широкую семантику, вытекающую из первичного значения исходного латинского слова.
Коррупции может быть подвержен любой человек, обладающий дискреционной властью — властью над распределением каких-либо не принадлежащих ему ресурсов по своему усмотрению (чиновник, депутат, судья, сотрудник правоохранительных органов, администратор, экзаменатор, врач и т. д.). Главным стимулом к коррупции является возможность получения экономической прибыли, связанной с использованием властных полномочий, а главным сдерживающим фактором — риск разоблачения и наказания.
Первоочередной задачей в борьбе с коррупцией является формирование антикоррупционного мировоззрения и правосознания. С этой целью профилактические мероприятия проводятся со всеми участниками образовательного процесса: руководителями, учащимися (воспитанниками).
1 февраля 2007 г. Россия официально вступила в «Группу государств против коррупции» (ГРЕКО). 7 мая 2009 г. наша страна подписала дополнительный протокол к Конвенции Совета Европы по уголовной ответственности за коррупцию.
С 07 по 11 декабря 2017 года в Ульяновской области проходит «Неделя антикоррупционных инициатив».
Без массового осознания гражданами колоссального вреда коррупции не может произойти серьезных позитивных перемен. Применение только карательных мер борьбы не позволяет обеспечить действенный контроль над коррупцией и ее негативными проявлениями, о чем свидетельствуют, например, события последних лет в Китае (введение расстрела). Исторический опыт, в том числе и нашей страны, свидетельствует о том, что именно умелое использование общественного контроля оказывалось эффективным средством любой национальной антикоррупционной стратегии.
Профессиональная работа учителя, преподавателя связана с необходимостью особых качеств личности, не закрепленных в официальных документах, но обусловленных характером педагогической деятельности, – чувства долга, совести, гуманитарной культуры. Гражданская, нравственно-этическая позиция педагога – важный залог успешности создания антикоррупционной атмосферы в обществе.
Вывод: Коррупцию можно победить, но совместными усилиями общества и государства. Важно чтобы коррупционер чувствовал себя не комфортно .
9 декабря 2020 г. Беседу провёл старший инструктор-методист Сорокина Н. А.
Беседа с учащимися начальных классов на тему «Что такое коррупция»?
Муниципальное образовательное учреждение Уразгильдинская общеобразовательная средняя школа имени Р. Ф. Гареева. Учитель начальных классов Нуртдинова Сания Акрямовна
«Самое главное при всяком государственном строе – это посредством законов и остального распорядка устроить дело так, чтобы должностным лицам невозможно было наживаться» (Аристотель)
Село Уразгильдино, 2013 год.
Цели и задачи:
Сформировать у учащихся представление о том, что такое коррупция, ознакомить с причинами возникновения коррупции, узнать какие меры принимаются правительством по борьбе с ней. Как молодежь может помочь в борьбе с коррупцией. Формирование собственного мнения и позиции по отношению к этому вопросу.
Развить у учащихся способности высказывать свое мнение и аргументировать его.
Воспитать чувство ответственности перед своим государством. Основная задача – сформировать четкую гражданскую позицию, основывающуюся на противостоянии коррупции.
Ход занятия:
I. Вступительная беседа
- Что такое коррупция? Каковы признаки коррупции?
- Многие сравнивают коррупцию с болячкой. У каждой болячки есть свои причины, которые нужно лечить. Каковы же причины коррупции?
Причины коррупции:
- Низкая заработная плата государственных служащих
- Незнание законов
- Желание легкой наживы
- Частая сменяемость лиц на различных должностях
- Нестабильность в стране
- Коррупция как привычка
- Низкий уровень жизни населения
- Слабая развитость государственных институтов
- Безработица
- Неразвитость институтов гражданского общества
- В каких формах проявляется коррупция?
II. Сценка «Коррупция»
- В четверг совещание было,
- Рассмотрен был важный вопрос:
- Правительство наше решило
- С коррупцией биться всерьез.
- Обзор негативных явлений
- Докладчик с трибуны читал,
- Потом перешли к обсужденью.
- Один подполковник сказал,
- Что, мол, дожидаться негоже,
- Когда нас возьмут в оборот,
- Мы сами взять за руку можем
- Любого, кто взятки берет!
- И, чтобы в глазах руководства
- В грязь не ударить лицом,
- Нам план разработать придется,
- Как будем ловить подлецов:
- «С кого же начнем? Предлагайте!
- Смелее! Здесь только свои!»
- Весь зал зашумел: «А давайте
- Поймаем на взятках ГАИ!»
- Начальник ГАИ, беспокоясь
- За честь подчиненных своих,
- Ответил: «Имейте же совесть –
- На днях осудили двоих!
- Давайте-ка в рамках закона
- Проверим бойцов ППС,
- Вон, их командир батальона
- Недавно купил «Мерседес»!»
- Однако начальник по кадрам
- Резонно заметил в ответ:
- «Сержантов тревожить не надо,
- У них без того — некомплект!»
- Потом предложение было:
- «Задать участковым дрозда»,
- Но тут же его отклонили:
- Кто ж будет работать тогда?
- И даже начальника тыла
- Затронул товарищ один,
- За то, что в клозете нет мыла,
- «Налево» уходит бензин,
- На даче он выстроил терем,
- Забор обложил кирпичом.
- Но это совсем не по теме,
- Коррупция здесь ни при чем!
- … Вот так перебрали все службы,
- В Москву был направлен ответ,
- О том, что нас трогать не нужно,
- Поскольку коррупции нет!
III. Задание:
Рассмотреть ситуации и указать, в которых из них представлены случаи коррупции, а в которых нет. Свой выбор аргументировать.
Ситуации:
- В благодарность за то, что врач вылечил её тяжело больного ребёнка, Она З. подарила врачу букет роз из своего сада.
- Ольга С. договорилась со строительной фирмой “Забота”, что если фирма финансирует её выборы в районный совет, то она впоследствии будет помогать этой фирме получать хорошие заказы на строительство в районе разных зданий.
- Государственное должностное лицо пользуется служебным автомобилем и топливом в личных целях.
- Человеку нужна помощь в одном из правительственных департаментов. Должностное лицо сознательно “тянет” время. Человек, чтобы отблагодарить должностное лицо, даёт ему денег, чтобы его вопрос решался быстрее.
- Должностное лицо правительства поздно приходит на работу, рано возвращается с работы и в рабочее время занимается личными делами.
IV. Задание:
- Средней школе г. Иркутска из городского бюджета была выделена определенная сумма денег на закупку угля для котельной. В это время друг директора школы попросил занять ему большую сумму денег и пообещал вернуть через месяц. Директор одолжил деньги, которые предназначались для закупки угля. Однако друг директора несдержал обещания и не вернул деньги.
- После концерта известной музыкальной группы на улице произошла драка. Приехала милиция и забрала всех участников драки. Случайно среди хулиганов оказались иван и Олег, которые не принимали участия в драке, а возвращались домой. В милиции им предложили решить эту проблему «мирно» и «быстро», намекая просто заплатить некоторую сумму денег.
- Инспектор Главного управления безопасности дорожного движения остановил водителя ВАЗ 21-10, нарушившего Правила дорожного движения. Водителем автомобиля оказался генерал. Генерал показал удостоверение, отругал инспектора и уехал.
- Начальник Государственной налоговой инспекции при составлении отчета за месяц о проверках магазинов города, внес в него данные о том, что магазин его друга регулярно уплачивал налоги, хотя данные в итоге не подтвердились.
- Главный врач районной больницы No 2 не следит за порядком и за выполнением медицинским персоналом своих обязанностей. Врачи и медсестры не смотрят должным образом за больными, в больнице работает устаревшее оборудование, а также условия в больнице больных возникают осложнения, и ухудшается здоровье.
Что могу сделать я?
Коррупция не исчезнет до тех пор, пока мы не заставим ее исчезнуть. Поступайте правильно:
- не давайте и не берите взятки;
- старайтесь добиваться желаемых результатов на основе личной добропорядочности;
- предавайте гласности случаи коррупции.
Вы также можете:
- изменить существующую систему и создать законы, которые бы защищали активных граждан, выступающих против коррупции;
- писать об известных вам случаях коррупции в местные газеты;
- принимать участие в проводимых во всем мире многочисленных кампаниях, акциях по борьбе с коррупцией.
- Изучать данное явление
- Знакомиться с антикоррупционными мероприятиями и методами борьбы с коррупцией.
УЧИТЕЛЬ:
Считаю, сегодняшнее мероприятие затронуло очень серьезную проблему, есть над чем поразмыслить и рассуждать. Дело молодежи нужно поддержать. Здесь только не должно быть эмоциональных перегибов, непроверенных фактов. Главное, чтобы не получился молодежный террор. Нужно принимать только тщательно выверенные решения.
На этом наш классный час закончен. В следующий раз мы поговорим о «коррупция за и против», а так же более подробно изучим «Закон о борьбе с коррупцией».
Домашнее задание
Написать эссе на тему: «Чтобы я сделал для борьбы с коррупцией»
Источник.
Беседа на тему «Детям о коррупции»
Подготовительная работа к школе логопедическая группа МБДОУ 170. г. Оренбург
Конспект подготовили воспитатели:
- Карпова Т. И.
- Ушакова И. П.
ЦЕЛЬ: создание условий для формирования у детей антикоррупционного мировоззрения
ОБРАЗОВАТЕЛЬНЫЕ ЗАДАЧИ:
- дать понятие коррупции
- уточнить знания детей о честности, порядочности
РАЗВИВАЮЩИЕ ЗАДАЧИ:
- учить правильно оценивать положительные и негативные поступки литературных героев и свои
ВОСПИТАТЕЛЬНЫЕ ЗАДАЧИ:
- воспитывать честность, правдивость
СЛОВАРНАЯ РАБОТА: закон, законодательство, коррупция, взятка, мошенничество, наказание, противозаконно, взятка, законопослушный, здравствование (житье, жизнь)
ИНТЕГРАЦИЯ ОБЛАСТЕЙ: познавательная, речевая, художественно-эстетическая, физическая
ОБОРУДОВАНИЕ: карточки-цветочки красного и синего цвета, мяч, бумага, карандаши, воздушные шары
ХОД БЕСЕДЫ:
Воспитатель (далее – В): ребята, мы сегодня поговорим о коррупции. Поймем, почему все взрослые говорят: «Коррупция – это очень плохо!» За это наказывают. Это противозаконно.
Может, вы слышали это слово? Нет? Тогда я расскажу вам сказку, и вам все станет ясно…. (авторская сказка Карповой Т. И.)
Жили-были Дед и Баба. И была у них Коза – такая добрая, ласковая. Паслась она на лугу и приносила молоко для стариков. Однажды Коза гуляла на лугу и забрела в лес. Кустик за кустик, шла, шла и заблудилась….День, второй проходит, – не найдет Коза дороги домой. Бродит по лесу – устала…., вдруг видит на поляне Теремок. «Как хорошо. в теремке можно отдохнуть»,- подумала Коза и постучала.
Выглянула мышка в окошко. Коза попросила у нее разрешения отдохнуть в теремке, набраться сил. А мышка отвечает: «Заплати мне 100 рублей, тогда пущу!» А Коза говорит: «Мышка, откуда у меня деньги, я заблудилась, устала, не могу найти дорогу домой…. Да и в сказке все звери жили в теремке бесплатно!»
Мышка отвечает: «Это раньше так было… а теперь я здесь начальник! Плати или уходи!»Заплакала Коза и пошла дальше….
В – ребята, вам понравился ответ Мышки? Если «да» поднимите синий цветочек, если «нет» – то красный.
Дети объясняют, почему они подняли тот или иной цвет…
В- а Козу вам жалко? (ответы детей)
В – Мышка пользуется тем, что первая нашла теремок, стала начальником и стала брать деньги за проживание. Она воспользовалась своим положением и совершает поступок, противоречащий моральным установкам, т. е. нарушает лесной сказочный закон! Не хочет пускать Козу в теремок, пока та не заплатит деньги…. Это и есть коррупция.
В – Коррупция – это использование должностным лицом своих властных полномочий и прав в целях личной выгоды, которое противоречит законодательству, т. е. ЗАКОНУ. Мышка поступает противозаконно.
В- а теперь слушайте сказку дальше….
Идет Коза по лесу, плачет, тропинки не видит. И зацепилась за колючий куст, ножку поранила…. больно ножке. Вдруг видит – домик…. «Лесная больница» написано. А работала там Лисичка – медсестричка. Зашла Коза в больницу, попросила помощи у Лисы. А Лиса говорит: «Принеси мне двух курочек, да пожирней! Тогда помогу, вылечу!»
А Коза говорит: «Да где же я возьму тебе курочек, я дороги в деревню не знаю, ножка сильно боли, ходить не могу…». «Уходи тогда!»,-закричала Лиса и прогнала Козу. Опять заплакала Коза и пошла дальше….
В – ребята, в этом эпизоде мы тоже столкнулись с коррупцией. Поднимите ваши цветочки. Вам понравилось поведение Лисы? Объясните свой выбор цветка. (ответы детей).
В – да. Лиса не хочет лечить Козу, пока та не принесет ей курочек. Это тоже – коррупция, взятка. Это противозаконно!
В – что же случилось дальше в сказке….
Идет Коза дальше и видит большую двухэтажную берлогу. На вывеске написано «Хозяин леса – Медведь». «Вот кто мне поможет – Медведь! Он ведь хозяин леса, всех главней, он следит за порядком в лесу.». Зашла Коза к Медведю, поведала о своем горе…. Пожаловалась… А Медведь говорит: «Не печалься, Коза! Я тебе помогу…. Только у нас скоро лесные выборы, ты проголосуй за меня на выборах нового хозяина леса – тогда сразу помогу. «Эх,-подумала Коза, – и ты ищешь выгоду! Не помощник мне Медведь!» и тихонько ушла ….
В – ребята, оцените поступок медведя, поднимите цветочки. Дети объясняют свой выбор цвета и свое отношение к поведению медведя.
В – поступок медведя – это тоже коррупция. Он использует свою власть и положение ради своей выгоды, подкупает голоса избирателей на выборах
– А что надо делать медведю, чтобы за него голосовали с желанием лесные жители? (быть честным, добрым, справедливым, помогать добрыми делами и т. д.)
В – а скоро и конец нашей сказочке…
Идет Коза дальше, а навстречу ей Заяц, узнал о беде Козы, нашел листик подорожника, приложил к ранке на ножке Козы, обвязал осиновой веточкой. Стало Козе получше. Пошли вместе. Навстречу Ежик. Узнал о беде Козы, угостил ее лесным яблочком. А тут Сорока пролетала мимо, рассказали друзья ей о Козе. А Сорока говорит: «Я в лесу все дороги знаю, идите за мной…» Сорока полетела, а друзья поспешили за ней…. Так она указала путь Козе в деревню к Деду и Бабе. Обрадовались они, увидев свою любимицу, а помощников – добрых лесных зверей отблагодарили подарками. Тут и сказочке конец….
В – ребята, покажите свое отношение к поступкам зайца, ежика и сороки. Дети поднимают цветочки и объясняют свой выбор, высказывают свое мнение
В – а как бы вы поступали на месте героев сказки? Мышки, лисы, медведя и т. д.. Ответы детей.
– Скажите. подарки Деда и Бабы для друзей Козы, это коррупция, подкуп. взятка или подарок от души? Как вы думаете? (ответы детей, с помощью воспитателя)
ИГРА «ХОРОШО, ПЛОХО» (физминутка)
Дети встают в круг. Воспитатель бросает мяч и говорит разные ситуации. Дети ловят мяч и дают ответ с объяснением.
- соблюдать законы
- соблюдать права и обязанности
- нарушать законы
- говорить правду
- быть всегда честным
- брать взятки
- обманывать людей
- подкупать избирателей
- совершать добрые поступки, дела
- требовать или вымогать деньги. игрушки
- добросовестно выполнять свою работу
- воровать
- честно зарабатывать деньги и др.
В – с детства люди должны быть всегда справедливыми, честными. порядочными. законопослушными, милосердными. честно работать…. Это нормы и правила поведения. Кто нарушает эти правила (законы). тех наказывают специальные органы.
– Ребята, помните – всегда надо быть честным, не нарушать законы и быть против такой «болезни» времени – коррупции.
В – есть такая пословица «Честное здравствование – сердцу на радость»
Вы тоже делаете много добрых дел, растете честными, справедливыми…
Давайте об этом расскажем всему свету…
АКЦИЯ «ЧИСТЫЕ ЛАДОШКИ»
Дети на листе чистой бумаги обводят свои ладошки. Вырезают их. С помощью взрослого пишут, какие честные и добрые поступки они совершали. Подвязывают эти ладошки к воздушному шарику и на прогулке отпускают шарик в небо….
Спасибо, всем! Адрес публикации.
Когда я росла в детстве, ни одно Рождество не обходилось без коричневых фломастеров, мелков и цветных карандашей, разбросанных по нашему кухонному столу на протяжении всех праздников. Задолго до того, как изобилие рождественских товаров стало обычным явлением, моя мама, как и многие чернокожие родители в 1980-х и 1990-х годах, всегда превращала рождественские фигурки с лицами цвета персика в зеркальное отражение нашей афроамериканской семьи, словно Ангус МакГайвер (герой сериала американского «МакГайвер», известный тем, что мог сделать почти что угодно из подручных средств — Прим. ИноСМИ). Мама заботливо раскрашивала коричневым маркером лица эльфов и ангелочков на елочных украшениях, детей, колядующих на рождественских открытках и, что наиболее важно, все разнообразные версии самого Санта-Клауса.
Наш Санта был чернокожим, но для меня маленькой он не был Черным Сантой. Он был просто Сантой, без прилагательного. Иногда мама говорила мне, что нам пришлось самим раскрасить его лицо из-за нехватки коричневой краски у торговцев и издателей. И я была достаточно наивна, чтобы верить в это неловкое оправдание, пока позже, когда мне исполнилось 10 лет, мне не пришло время увидеть зияющие «дыры» во всей этой истории с Санта-Клаусом.
В течение следующих двух десятилетий я мало думала о Санта-Клаусе, пока летом 2011 года не родила сына. На День Благодарения в том году нам подарили очаровательный детский костюм Санта-Клауса, и когда я засунула в него коренастое коричневое тельце моего сына, у меня кружилась голова от ностальгии по собственному детству. Готовая воссоздать ту же самую праздничную страну чудес, в которой я выросла, я пошла за рождественскими украшениями с открытым сердцем и кошельком. Оба быстро закрылись, когда стало очевидно, что, хотя со времени моего детства прошло 20 лет, образы Санты остались такими же однообразными, что и раньше.
Как и моя мама, я разрисовывала им лица коричневой краской. Но эта моя работа была сдобрена здоровой дозой негодования — той роскошью, которой была лишена моя мать, которая выросла в сельской местности штата Вирджиния, где правили законы Джима Кроу (законы Джима Кроу, Джимкроуизм — широко распространённое неофициальное название законов о расовой сегрегации в некоторых штатах США в период 1890-1964 годов — Прим. ИноСМИ). Мама росла в том же месте и в то же время, что и незаконно казненная «Мартинсвиллская Семерка» (семеро чернокожих мужчин, незаконно казненных в 1951 году за изнасилование белой женщины в городке Мартинсвилл, штат Вирджиния, и посмертно помилованных в 2021 году — Прим. ИноСМИ) и преподавала там же в сегрегированном первом классе начальной школы в день убийства Мартина Лютера Кинга-младшего. В той шкале расовых травм, пережитых ею в своей жизни, раскрашивание лица Санты коричневой краской было едва ли не самой малозначительной.
Но для меня отсутствие фигурок темнокожих Дедов Морозов показалась личной обидой, как будто выражалось пренебрежение всей моей семье. Как будто вместо #OscarsSoWhite (только «белая» премия Оскар) появился еще и #SantasSoWhite (только «белый» Санта-Клаус). И дело здесь было не только в том, что елочные игрушки оказались разочаровывающе однообразными. В фильмах, телешоу, книжках с картинками и во всех других средствах массовой информации — почти везде фигурируют только белые Деды Морозы. Причем эти серийно выпускаемые Деды Морозы совсем необязательно отражают реалии нашей жизни: актер с японскими корнями Джордж Такей (Джордж Хосато Такэй — американский актёр, известный благодаря роли Хикару Сулу в сериале «Звёздный путь — Прим. ИноСМИ)». незабываемо описал визит азиатского Санта-Клауса, когда он и его семья были насильственно и несправедливо заключены в лагерь для интернированных американцев японского происхождения.
Пройдут годы, прежде чем эти оторванные истории сойдутся в снежный ком движения за разнообразие Санты, которое ширится сейчас. Но 2011 год — год рождения моего сына, был временем, когда Instagram и Pinterest еще только зарождались, поэтому единственным источником в моем поиске темнокожих Дедов Морозов был Google. Я использовала этот поисковик, чтобы найти продавца на сайте Etsy (веб-сайт интенрнет-торговли, который специализируется на изделиях ручной работы, антиквариате и уникальных товарах ограниченного выпуска — Прим. ИноСМИ) а Атланте, который отправлял моему сыну персональные поздравления от Черного Санты. А на eBay я нашла дорогие, но изысканные самодельные украшения и одежду ручной работы.
Я часами говорила по телефону, обзванивая различные места в Лос-Анджелесе, пока наконец не нашла Лэнгстона Паттерсона, одного из немногих черных Дедов Морозов, которые работали в то время в американских торговых центрах. Сфотографировать моего сына с этим щеголеватым Санта-Клаусом было самым ярким событием нашего Рождества, и мы с нетерпением ждали этого каждый год, пока моя работа не заставила меня переехать с семьей в Нью-Йорк.
Я предполагала, что найти Черного Санта-Клауса в самом разношерстном городе мира, будет легче. Так оно и оказалось, но только потому, что исполнительным продюсером моего радио-шоу была щедрая черная мама, которая взяла меня под свое крыло и дала мне инсайдерскую информацию. Как Гарриет Табмен, которая водит людей по подземной железной дороге, (Гарриет Табмен — американская аболиционистка, борец против рабства в США в 19 веке. Сбежав из рабства, она организовала сеть активистов по борьбе с ним и убежища, известные как Подземная железная дорога — Прим. ИноСМИ) эта мама и ее дочь благосклонно сопровождали мою семью, чтобы найти секретного Черного Санту в универмаге Macy’s, которого там называют «Специальный Санта» и которого можно отыскать только с помощью «сарафанного радио».
В Macy’s мы двигались в медленной очереди к «традиционному» белому Санте, спрятанному в комнате в конце толпы людей, пока возле нас не появился настоящий «эльф». Моя мамочка-наставница наклонилась к заостренному уху эльфа и прошептала: «Мы ищем Специального Санту». Эльф кивнул и показал нам большой палец вверх. Вскоре после этого другой эльф проводил нас к другой, но такой же длинной очереди, где мы ждали, пока волшебным образом не появился веселый Черный Санта и поздравил моего двухлетнего сына с Рождеством, слегка ткнув его кулаком и попросив «дать пять».
Когда мы ехали на такси домой, а наш довольный сын спал в своем автокресле, мы с мужем размышляли над абсурдностью этого чрезвычайно необычного опыта, но я была слишком измотана, чтобы чувствовать что-либо, кроме гордости за то, что мы успешно сохранили любовь моего ребенка к Деду Морозу еще на один год.
Через два дня после нашего визита в Macy’s Аиша Харрис опубликовала в Slate веселое эссе, в котором выразила то, что я испытала на собственном опыте. «Америка становится все менее и менее белой, но белый Санта с дефицитом меланина остается обычным явлением в рекламе, кастингах в торговых центрах и фильмах, — написала она. — Не пора ли сделать так, чтобы наш образ Санты лучше служил всем детям, которых он радует каждое Рождество?»
На следующий день телеведущая Мегин Келли (известная американская тележурналистка, работала на Fox News и канале NBC. Дважды брала интервью у Владимира Путина — Прим. ИноСМИ) ответила печально известной тирадой, провозгласив, что Санта и Иисус — это белые люди. Она говорила прямо в камеру, чтобы уверить всех детей, смотрящих Fox News, что, несмотря на все, что они могли ранее слышать, Санта является абсолютно белым, и что любой, кто думает иначе, не только неправ, но и смешон.
Как мать я была в ярости. Как журналистка и радиоведущая, я была полна решимости доказать, что Мегин Келли и другие близкие ей по духу люди, которые думали, как она, неправы. И я была не одна. На протяжении многих лет я писала рукопись моей новой иллюстрированной книги «Настоящий Санта-Клаус», которая представляет собой рождественскую сказку о Черном Санта-Клаусе, которую я хотела впоследствии дать прочитать своим детям. Одновременно начали действовать некоторые редприниматели.
Теперь компания Black Santa Company бывшей звезды НБА Барона Дэвиса (известный американский профессиональный баскетболист, играл за команды «Лос-Анджелес Клипперс» и «Кливленд Кавальерс» — Прим. ИноСМИ), небольшая компания по производству подарочной упаковки с блестящим названием Wrappers Delight и другие предприятия, занятые в сфере рождественских развлечений, строят планы на будущее, в котором ни одному ребенку больше не придется раскрашивать рождественские украшения.
Наши усилия работают. Лично мое достижение — это одна из по крайней мере трех детских книжек с картинками цветных Санта-Клаусов, изданных в этом году. У всех нас очень разные взгляды на то, как он мог бы выглядеть Санта, но чем больше разнообразия, тем веселее.
Давайте отбросим представление о том, что есть только один образ Санта-Клауса, и перестанем спорить о том, чья интерпретация Новогоднего дедушки верна. Пора направить всю силу рождественской сказки на самое драгоценное и важное — собственное воображение ребенка.
__________________________________________________________________________________
Нэнси Редд — известная радио- и телеведущая, автор нескольких книг, в том числе «Перед сном» и «Настоящий Санта». Она также является обозревателем популярного сайта Wirecutter.
Комментарии читателей The New York Times
World
Довольно скоро у нас будет отдельно все для всех, так что все расы представлены-то будут, но общество окажется еще более сегрегированным. Детям было бы лучше, если бы Санта стал вообще пришельцем из космоса.
Suzan
Мои два племянника — единственные дети в нашей семье. Они выросли, отмечая Хануку и все другие еврейские праздники, вместе со своей мамой, моей сестрой. Но у них также бывало и Рождество — каждый декабрь они навещали семью своего отца. Но Санта никогда не играл в их жизни большой роли. Я всегда буду помнить тот год, когда мой младший племянник сказал моей сестре о Санта-Клаусе, как сильно он не хочет видеть «этого страшного красного клоуна»!
Curmudgeon51
Я только что проверил Amazon на предмет «Черного Санты», и там перечислены несколько сотен товаров, в том числе украшение в виде дерева «Black Santas Matter». Если общество и не согласно признать, что Санта-Клаус (и другие мифические персонажи) не являются исключительной прерогативой белых, то, по крайней мере, некоторые коммерческие предприятия признают, что это важно.
rose6
Много лет назад я водил своих детей на встречу с Санта-Клаусом в магазин Macy’s в Нью-Йорке. Когда мы вышли из лифта в зимнюю страну чудес, нас встретили указатели, направляющие к Санта-Клаусам в трех направлениях с пометками «Санта-Клаус Черный», «Санта-Клаус Белый» и «Санта-Клаус Латинос».
Dan Stackhouse
Забавно, что никто еще не догадался переосмыслить полностью выдуманного Санту и представить его как женщину или вообще бесполое существо. Ведь сегодня никто не ходит в торговые центры, чтобы навестить миссис Клаус, и на самом деле мы никогда не видим ее в торговых центрах, только эльфов.
Я думаю, что это когда-нибудь произойдет. Женщины-Санты будут вполне себе ничего, как и трансгендерные Деды Морозы. Чем больше разнообразия в этих мифологических конструкциях, тем больше людей принимает разнообразие в реальной жизни. Правда, трудно себе представить, чтобы фанаты Fox News когда-либо приняли что-либо, кроме белого расизма, гомофобии и женоненавистничества.
René
Созданный американцами, Санта — это король капитализма, великий покровитель бизнеса. У нас должны быть Деды Морозы всех цветов, чтобы максимально увеличить траты людей и вытянуть из них как можно больше денег.
Matt
Как бы там ни было, но похоже, что Америка вновь вводит и одобряет расовую сегрегацию.
Колледжи, в которых теперь есть общежития, места для учебы и мероприятий только для чернокожих. Есть попытки заблокировать расовое разнообразие.
Вы можете утверждать, что это нормально, когда так поступают меньшинства, но это не подает хороший пример остальным.
Mathilda
Неправильно. Цветным студентам нужны собственные пространства в университетах, особенно если большинство их однокашников белые. Я небелый преподаватель из рабочего класса. Все мои коллеги — представители высшего среднего класса и белые. Они понятия не имеют, что такое разнообразие на самом деле.
Сегрегация стала причиной выселения моей небелой семьи и соседей. Наш многоквартирный дом был снесен, а на его месте построен кондоминиум с дорогими квартирами.
Shawn Davis
Значит, у нас должны быть отдельные очереди в торговом центре, чтобы ждать Санта, который представляет в расовом отношении именно нас? Если у нас есть отдельные очереди для этого, почему бы не ввести расовые очереди и для других вещей? Это один из самых расистских аргументов, которые я слышал за последнее время. Национальные символы могут иметь значение только в том случае, если они соответствуют нашей расовой идентичности? Уродливо злой аргумент. Такая разнообразная нация, как наша, не сможет сохраниться, если все будут просто считать себя членами какой-то одной расовой группы, а не едиными американцами.
PL
Есть что-то тревожное в картине двух очередей, черной и белой, в универмаге, ожидающих встречи с Санта-Клаусом. Это и называется сегрегацией. Само-сегрегация, но тем не менее это сегрегация. Кредо антирасизма поставило либеральные идеалы с ног на голову. О чем говорит спрос на Дедов Морозов, врачей и других, которые «похожи на меня»? Это указывает на глубокое чувство обособленности от общества в целом, фундаментальное недоверие к белым как ни к чему иному, а только угнетателям: белые врачи не могут захотеть помочь черным людям предотвратить болезнь или вылечиться от нее; белый Санта не может порадовать черных детей. Вот чему вы учите своих детей. Универмаги могут нанимать Дедов Морозов, которые отражают национальный состав окружающих сообществ, но это обособление Дедов Морозов по этническому признаку подрывает любую надежду на единство в нашем обществе. Сейчас «разнообразию» придается такое большое значение, что страна просто разваливается на части. Это недоверие друг к другу не только усугубляет раскол, оно буквально убивает: сколько черных жизней было потеряно из-за пандемии коронавируса, потому что они недостаточно доверяли белому медицинскому персоналу для того, чтобы вакцинироваться у него?
Материалы ИноСМИ содержат оценки исключительно зарубежных СМИ и не отражают позицию редакции ИноСМИ.
Ответы на вопросы учебника «Литература» 5 класс, 1 часть, Коровина, страницы 148-149
Размышляем о прочитанном
1. Понравилась ли вам сказка? Увлекли ли вас события, происходящие с Алёшей? Менялось ли ваше отношение к герою сказки по ходу чтения? Почему?
Это очень интересная и увлекательная сказка. Она мне понравилась.
Отношение к Алёше у меня менялось, в зависимости от его поступков. В начале сказки я его жалела, он вызывал симпатию. Когда он загордился, мне стало стыдно за него. Когда он переболел и исправился, я вновь сочувствовала ему.
2. Перечитайте описание Петербурга и дома, в котором располагался пансион. Как вы думаете могло ли быть такое детальное описание в народной волшебной сказке? Если нет, то почему?
В народных сказках не может быть столь детальных описаний.
Они изначально были устными, передавались от рассказчика к рассказчику, а в таком случае передаются лишь основные события, мелкие детали каждый рассказчик придумывает сам. Невозможно запомнить и повторно воспроизвести такое детальное описание какого-нибудь дворца или избушки на курьих ножках.
3. Почему Алёша «пристально смотрел в круглые дырочки, которыми усеян был забор»? Что он хотел увидеть? Чего ожидал? Почему его разочаровал приезд директора?
Алёша мечтал увидеть волшебницу, которая провертела для него эти дырочки, как он думал. Он ждал, что волшебница принесёт игрушку или письмо от родных.
Также Алёша ждал приезд директора. Он представлял его рыцарем из романов, которыми зачитывался. Но приехал обычный лысый человек. Для Алёши такой неказистый директор стал разочарованием.
4. Как Алёша спас Чернушку? Перескажите эпизод спасения от лица Алёши, передавая те чувства, которые он переживал.
Алёша спас Чернушку, выкупив её у кухарки, хотевшей зарезать курицу.
Пересказ эпизода спасения Чернушки от лица Алёши
В тот день я как обычно кормил курочек. Вдруг я увидел, как во двор вышла кухарка Трина с огромным ножом. Я знал, что кухарка убивает кур и петушков, и моё сердце сжалось от предчувствия беды.
Я стал размахивать руками, отгоняя кур, потом встал и бросился прочь. Я не хотел, не мог видеть, как кухарка поймает кого-нибудь из моих любимцев. Мне хотелось плакать от горя.
Позади что-то кричала кухарка, но я не слушал её, убегая всё дальше. Как вдруг голос Чернушки пробился до моего сознания. Чернушка громко кричала от страха, и я понял, что Трина поймала именно её.
Забыв про страх, я бросился обратно и запрыгнул на шею кухарке. Та от неожиданности выпустила Чернушку и курица взлетела на крышу, торжествующе вереща. Трина начала было ругаться, но я протянул ей империал, единственное богатство, которое у меня было. Мне было не жаль расставаться с деньгами, ведь я спасал жизнь своего друга.
Трина взяла деньги, Чернушка была спасена, я был счастлив.
5. Как менялся характер Алёши после того, как король вручил ему конопляное семечко? Расскажите об этом подробно от лица одного из одноклассников Алёши.
Характер Алёши испортился. Он стал важничать и считать себя умнее всех.
Рассказ о характере Алёши от лица его товарища
Я давно знаю Алёшу и даже дружил с ним. В то время он был скромным и добрым мальчиком, которого все любили. Если его наказывали, то Алёшу все жалели.
Но потом с ним что-то случилось. Характер Алёши стал меняться не в лучшую сторону. Он грубил, стал заносчивым, считал себя умнее всех.
И постепенно от Алёши все отвернулись. Мы больше не были с ним друзьями, а когда он попытался обратиться ко мне, я просто отвернулся.
А Алёша стал врать и выдумывать небылицы. За этого его строго наказал учитель и никому не было жаль Алёшу.
После наказания Алёша долго болел, а когда поправился, вновь стал нормальным мальчиком. Алёша опять был скромным и добрым. Постепенно к нему стали относиться лучше, а я думаю, что мы снова подружимся.
6. Почему Алёша стыдился рассказывать кому-либо о том, что с ним произошло?
Алёше было стыдно вспоминать своё некрасивое поведение и трусость. Он хотел бы вычеркнуть этот эпизод не только из памяти, но и из жизни..
7. Похож ли Алёша на героя русских народных волшебных сказок? Положительный он герой или отрицательный? Бывают ли такие герои в народных сказках?
Алёша совершенно не похож на героя волшебной сказки. Он обычный мальчик, такой как все вокруг. Он не очень смел и может ошибаться.
Алеша не положительный и не отрицательный герой. В начале сказки он совершает добрые поступки и является положительным героем. В середине Алёша совершает глупости и ведёт себя плохо. Он становится отрицательным героем. В конце он исправляется и вновь оказывается героем положительным.
Таких героев в волшебных сказках нет. Там они либо положительные, либо отрицательные.
Обогащаем свою речь
1. Объясните слова, подберите синонимы, составьте в ними предложения.
Суровый. Строгий, сердитый. Учитель был суровым, но справедливым.
Дряхлый. Старый, слабый. Дряхлый дед сидел на лавочке.
Отдалённый. Далёкий. Отдалённый холм зарос лесом.
Неведомый. Незнакомый, неизвестный. Неведомый зверь оставил следы на тропе.
Невиданный. Чудесный, неизвестный. Невиданный мир лежал за рекой.
Грозный. Сердитый, строгий. Грозно посмотрел он на меня.
Тужить. Грустить, печалиться. Не надо тужить о лете.
Снарядился. Собрался, приготовился. Он снарядился в поход.
Желанный. Ожидаемый, вожделенный. Желанный случай представился скоро.
Трезвонить. Звонить, болтать. Хватить трезвонить о ерунде.
Перечить. Идти наперекор, прекословить, огрызаться. Будешь перечить — быть тебе битым.
Потешить. Веселить, смешить. Учитель потешил учеников смешным заданием.
Печальный. Грустный, невесёлый. Печальный страус смотрел на закат.
2. Найдите в сказке Погорельского слова, которые редко используются в современной речи (например: нынешний, пансион, сказывал, говаривал, утешение). Подумайте, какие из них незаслуженно мало используются в современной речи.
Слова, которые редко используются в современной речи:
Помещался, славный, заступали, нежели, тогдашний, содержатель, дортуары, письмецо, бранчливая, возымел, с горестию, умильно, ободрился, шандалы, кисейные, учительша, несбыточное, яхонты, насилу мог, особливо, обхождение.
Мне нравится слово Учительша и жаль, что сейчас его не используют. Оно кажется мне более ласковым, чем привычное Учительница.