Элемент управления CreateUserWizard

146

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

<asp:CreateUserWizard ID="CreateUserWizard1" runat="server">
	<TitleTextStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
	<WizardSteps>
	    <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
	    </asp:CreateUserWizardStep>
	    <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
	    </asp:CompleteWizardStep>
	</WizardSteps>
</asp:CreateUserWizard>
Простой элемент управления CreateUserWizard

Внешний вид по умолчанию этого элемента управления также поддается настройке через свойства и стили.

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

Применяя CreateUserWizard, как показано выше, проводить какое-то специальное конфигурирование не понадобится. Этот элемент автоматически использует настроенный поставщик членства и включает в себя два шага: шаг по умолчанию CreateUserWizardStep, на котором создаются элементы, требуемые для сбора необходимой информации, и CompleteWizardStep - для отображения подтверждающего сообщения. Оба шага настраиваются через стили и свойства или же с помощью шаблонов. Хотя эти два шага можно настроить по собственному усмотрению, удалить их нельзя.

В случае использования шаблонов вы отвечаете за создание необходимых элементов управления, как показано ниже:

<asp:CreateUserWizard ID="RegisterUser" runat="server"
            BorderStyle="ridge" BackColor="aquamarine">
	<TitleTextStyle Font-Bold="True" Font-Names="Verdana" />
	<WizardSteps>
	    
	    <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
	        <ContentTemplate>
		<div style="text-align: right; font-family: 'Courier New'">
		    Имя пользователя:
		    <asp:TextBox ID="UserName" runat="server" /><br />
		    Пароль:
		    <asp:TextBox ID="Password" runat="server" TextMode="Password" /><br />
		    Повторите пароль:
		    <asp:TextBox ID="ConfirmPassword" runat="server" TextMode="Password" /><br />
		    Email: 
		    <asp:TextBox ID="Email" runat="server" /><br />
		    Секретный вопрос:
		    <asp:TextBox ID="Question" runat="server" /><br />
		    Ответ:
		    <asp:TextBox ID="Answer" runat="server" /><br />
		    <asp:Literal ID="ErrorMessage" runat="server" EnableViewState="False" />
		</div>
	        </ContentTemplate>
	    </asp:CreateUserWizardStep>
	    <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
	        <ContentTemplate>
		Ваш аккаунт был успешно создан!</td>
		<asp:Button ID="ContinueButton" CommandName="Continue"
		    runat="server" Text="Продолжить" />
	        </ContentTemplate>
	    </asp:CompleteWizardStep>
        
	</WizardSteps>
</asp:CreateUserWizard>

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

Обязательные и необязательные элементы управления CreateUserWizard
Идентификатор Тип Обязателен? Комментарии
UserName System.Web.UI.WebControls.TextBox Да Требуется всегда
Password TextBox Да Требуется всегда
ConfirmPassword TextBox Да Требуется всегда
Email TextBox Нет Требуется только в случае, если свойство RequireEmail установлено в true
Question TextBox Нет Требуется только в случае, если лежащий в основе поставщик членства требует наличия контрольного вопроса
Answer TextBox Нет Требуется только в случае, если лежащий в основе поставщик членства требует наличия контрольного вопроса
ContinueButton Любой элемент управления, поддерживающий пузырьковое распространение событий Нет Вообще не обязателен, но если присутствует, то свойство CommandName необходимо установить в Continue

В случае создания дополнительных шагов мастера придется обрабатывать события и выполнять некоторые действия в процедурах событий. Например, если вы посредством мастера собираете дополнительную информацию о пользователе, то должны ее где-то сохранить, а потому выполнить некоторые SQL-операторы в базе данных (предполагая, что информация хранится, например, в базе данных SQL Server). В таблице ниже перечислены события, специфичные для элемента управления CreateUserWizard. Кроме того, он наследует все события, которые известны по элементу управления Wizard:

События CreateUserWizard
Событие Описание
CreatingUser

Инициируется мастером перед тем, как он создает нового пользователя через Membership API

CreatedUser

Это событие инициируется после успешного создания пользователя

CreateUserError

Это событие инициируется, если создать пользователя не удалось

SendingEmail

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

SendMailError

Если элементу управления не удается отправить сообщение электронной почты (например, по причине недоступности почтового сервера), инициируется это событие

ContinueButtonClick

Инициируется, когда пользователь щелкает на кнопке Continue (Продолжить) на последнем шаге мастера

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

Более того, событие CreatedUser инициируется немедленно после успешного завершения CreateUserWizardStep. Поэтому, если вы хотите сохранить дополнительные данные внутри этого события, их необходимо собрать на предыдущих шагах. Для этой цели достаточно поместить другие шаги мастера перед дескриптором <asp:CreateUserWizardStep>. В любом другом случае придется сохранять эту информацию в одном из других событий (например, в событии FinishButtonClick). Но поскольку нет гарантии, что пользователь уже прошел все шаги мастера и щелкает на кнопке Finish (Готово), имеет смысл собрать всю необходимую информацию до CreateUserWizardStep, а затем сохранить всю дополнительную информацию в событии CreatedUser:

<asp:CreateUserWizard ID="RegisterUser" runat="server" 
   OnCreatedUser="RegisterUser_CreatedUser"">
	
	<WizardSteps>
	    <asp:WizardStep AllowReturn="true" ID="NameStep">
	        Имя:
	        <asp:TextBox ID="FirstnameText" runat="server" /><br />
	        Фамилия:
	        <asp:TextBox ID="LastnameText" runat="server" /><br />
	        Возраст:
	        <asp:TextBox ID="AgeText" runat="server" />
	    </asp:WizardStep>
	    <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
	        ...
	    </asp:CreateUserWizardStep>
	    <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
	        ...
	    </asp:CompleteWizardStep>
	</WizardSteps>
	
</asp:CreateUserWizard>

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

private short _Age;
private string _Firstname, _Lastname;

protected void Page_Load(object sender, EventArgs e)
{
        if (!this.IsPostBack)
        {
            _Age = -1;
            _Firstname = _Lastname = string.Empty;
        }
}

protected void RegisterUser_CreatedUser(object sender, EventArgs e)
{
        // Найти правильный шаг мастера
        WizardStepBase step = null;
        for (int i = 0; i < RegisterUser.WizardSteps.Count; i++)
        {
            if (RegisterUser.WizardSteps[i].ID == "NameStep")
            {
                step = RegisterUser.WizardSteps[i];
                break;
            }
        }

        if (step != null)
        {
            _Firstname = ((TextBox)step.FindControl("FirstnameText")).Text;
            _Lastname = ((TextBox)step.FindControl("LastnameText")).Text;
            _Age = short.Parse(((TextBox)step.FindControl("AgeTExt")).Text);

            // Сохранить информацию.
            // Замените это кодом для действительного сохранения информации
            System.Diagnostics.Debug.WriteLine(string.Format(
                "{0} {1} {2}", _Firstname, _Lastname, _Age));
        }
}

В обработчике события CreatedUser код просто ищет шаг мастера с идентификатором NameStep. Затем несколько раз применяется метод FindControl(), чтобы получить элемент управления с требуемым содержимым. Как только извлечены нужные элементы, в которых пользователь ввел свое имя, фамилию и возраст, можно обращаться к их свойствам и выполнять с ними любые действия.

В итоге можно сказать, что CreateUserWizard - мощный элемент управления, построенный на основе Membership API, гибко настраиваемый, как и другие элементы управления, связанные с входом пользователя, которые поставляются в составе ASP.NET. Применяя шаблоны, вы получаете полную свободу в изменении их внешнего вида, при этом они выполняют огромный объем работы - особенно в том, что касается взаимодействия с Membership API. И если вы все-таки предпочитаете выполнять какие-то действия самостоятельно, можете перехватывать некоторые события и обрабатывать их по-своему.

Пройди тесты
Лучший чат для C# программистов