Главная страница

лекция. Зиборов. Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги


Скачать 7.39 Mb.
НазваниеСправочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги
Анкорлекция
Дата13.04.2023
Размер7.39 Mb.
Формат файлаdoc
Имя файлаЗиборов.doc
ТипСправочник
#1060897
страница20 из 31
1   ...   16   17   18   19   20   21   22   23   ...   31

Рис. 13.10. Фрагмент работы регистрационной формы

Как видно, для создания такой формы потребовалось четыре метки Label, три текстовых поля TextBox и командная кнопка Button. Кроме того, для контроля правильности ввода данных перетащим из панели Toolbox несколько валидаторов. Так, для контроля обязательности ввода в первые два текстовых поля перенесем в форму два валидатора RequireFieldValidotor. Для контроля полей Пароль и Под­тверждение пароля перенесем валидатор CompareValidotor, он будет сравнивать эти два поля, поэтому валидатор обязательности ввода для поля Подтверждение пароля не нужен. В листинге 13.5 приведено содержимое файла программной поддержки Registration.aspx.cs.

Листинг 13.5. Регистрация пользователя

// Регистрация и аутентификация пользователя с помощью базы данных MS Access

// Данный пример включает в себя три Web-формы: Registration.aspx, Login.aspx и Secret.aspx.

// Первая форма Registration.aspx приглашает пользователя ввести регистрационные данные,

// проверяет правильность ввода имени пользователя и пароля с использованием валидаторов,

// регистрирует пользователя в базе данных MS Access и перенаправляет пользователя на уже

// разрешенный после регистрации ресурс Secret.aspx

using System;

using System.Web.Ul.WebControls;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace Login

{

public partial class WebForm1: System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{ // Обработка события "загрузка страницы"

Page.Title = "РЕГИСТРАЦИЯ";

Label1.Text = "ВВЕДИТЕ РЕГИСТРАЦИОННЫЕ ДАННЫЕ";

Label2.Text = "Имя"; Label3.Text = "Пароль";

Label4.Text = "Подтвердите пароль";

Button1.Text = "Готово"; TextBox1.Focus();

TextBox2.TextMode = TextBoxMode.Password;

TextBox3.TextMode = TextBoxMode.Password;

// Контролируем факт заполнения двух текстовых полей:

RequiredFieldValidator1.ControlToValidate = "TextBox1";

RequiredFieldValidatorl.ErrorMessage = "* Следует заполнить это текстовое поле"; RequiredFieldValidator2.ControlToValidate = "TextBox2";

RequiredFieldValidator2.ErrorMessage = "* Следует заполнить это текстовое поле";

// Контроль правильности введения паспорта путем сравнения содержимого двух полей:

CompareValidator1.ControlToValidate = "TextBox2";

CompareValidatorl.ControlToCompare = "TextBox3";

CompareValidatorl.ErrorMessage = "* Вы ввели разные паспорта";

}

protected void Button1_Click(object sender, EventArgs e)

{ // Обработка события "щелчок на кнопке".

// Запись в базу данных только при повторной отправке

//и при достоверных данных

if (IsPostBack == false || IsValid == false) return;

// Здесь можно записать введенные пользователем сведения в БД.

// Строка подключения:

string СтрокаПодкл = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Web.mdb");

// MapPath - возвращает физический путь.

// Создание экземпляра объекта Connection:

var Подключение = new OleDbConnection(СтрокаПодкл);

try

{ // Открытие подключения

Подключение.Open();

}

catch (Exception ех2)

{

Response.Write("

" + ех2.Message);

return;

}

var Команда = new OleDbCommand();

// ДОБАВЛЕНИЕ ЗАПИСИ О ПОЛЬЗОВАТЕЛЕ В БД.

// Строка SQL-запроса

string SQL_3anpoc = "INSERT INTO [Аутентифицированные пользовате" +

"ли] ([Имя пользователя], [Пароль]) VALUES (‘ " + TextBox1.Text + " ‘, ‘ " + TextBox2.Text + " ' ) ";

// Создание объекта Command с заданием SQL-запроса

Команда.CommandText = SQL_3anpoc;

// Для добавления записи в БД эта команда обязательна

Команда.Connection = Подключение;

Try

{ // Выполнение команды SQL, т. е. ЗАПИСЬ В БД

Команда. ExecuteNonQuery () ;

}

catch (Exception ехЗ)

{

Response.Write("

" + ехЗ.Message);

return;

}

Подключение.Close();

// Перенаправление на уже разрешенную страницу

Response.Redirect("Secret.aspx");

}

}

}

Как видно, в данном программном коде при обработке события загрузки формы происходит проверка достоверности введенных пользователем данных с помо­щью валидаторов так же, как и в предыдущем примере. При нажатии пользователем кнопки Готово запись в базу данных происходит только при повторной отправке данных IsPostBack = true, а также при достоверности введенных данных IsValid = true. Для записи в базу данных мы не стали переносить в форму соответствующие элементы управления из панели Toolbox, а очень кратко и выразительно использовали их непосредственно в программном коде.

Теперь создадим Web-страницу для проверки имени пользователя и пароля с использованием таблицы Аутентифицированные пользователи в базе данных. Для этого добавим к текущему проекту новую Web-форму, выбрав в пункте меню Project команду Add New Item | Web Form. Назовем эту новую форму Login.aspx. Внешний вид формы, запрашивающей у пользователя имя и пароль с их проверкой в базе данных, показан на рис. 13.11.



Рис. 13.11. Форма аутентификации пользователя

Здесь потребовалось пять меток, два текстовых поля и две командных кнопки. Пятую метку на рис. 13.11 не видно, мы расположили ее между кнопками. В листинге 13.6 приведено содержимое файла программной поддержки Login.aspx.cs.

Листинг 13.6. Аутентификация пользователя

//Вторая форма Login.aspx запрашивает имя пользователя и пароль, проверяет наличие пользователя с таким

// именем и паролем в базе данных. Если такого пользователя не оказалось, то форма отправляет

// пользователя на регистрацию Registration.aspx, а если есть, то он получает доступ к ресурсу Secret.aspx

using System;

using System.Web.Ul.WebControls;

// Импортируем пространство имен для манипуляций БД:
using System.Data.OleDb;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace Login

{

Public partial class Login : Systern.Web.UI. Page

{

protected void Page_Load(object sender, EventArgs e)

{

Page.Title = "Логин"; Page.Form.Method = "post";
Label1.Text = "АУТЕНТИФИКАЦИЯ ПОЛЬЗОВАТЕЛЯ";
Label2.Text = "Имя"; Label3.Text = "Пароль";

Label4.Text = string.Empty; Label5.Text = string.Empty;
TextBox1.Focus(); TextBox2.TextMode = TextBoxMode.Password;

Button1.Text = "Готово"; Button2.Text = "Регистрация";
Button1.Width = 125; Button2.Width = 125;

TextBox1.Width = 140; TextBox1.Width = 140;

}

protected void Button1_Click(object sender, EventArgs e)

{ // Щелчок на кнопке "Готово"

bool П0ЛЬ30ВАТЕЛЬ_АУТЕНТИФИЦИР0ВАН = false;

// Строка подключения

string СтрокаПодкл = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Web.mdb");

// Создание экземпляра объекта класса Connection

var Подключение = new OleDbConnection(СтрокаПодкл);

try

{ // Открытие подключения

Подключение.Open();

}

catch (Exception ex1)

{

Label5.Text = exl.Message;

}

// Строка SQL-запроса для проверки имени и пароля

string SQL_3anpoc = "SELECT Пароль FROM [Аутентифицированные пользо" +

"ватели] WHERE ([Имя пользователя] = ‘ " + TextBox1. Text + " ‘) AND (Пароль = ‘ " + TextBox2. Text + "')";

// Создание объекта Command с заданием SQL-запроса

var Команда = new OleDbCommand();

Команда.CommandText = SQL_3anpoc;

Команда.Connection = Подключение;

Try

{ // Выполнение команды SQL

OleDbDataReader Читатель = Команда.ExecuteReader();

if (Читатель.Read() == true)

{

П0ЛЬ30ВАТЕЛЬ_АУТЕНТИФИЦИР0ВАН = true;

Label4.Text = "Пользователь аутентифицирован";

}

else

{

П0ЛЬ30ВАТЕЛЬ_АУТЕНТИФИЦИР0ВАН = false;

Label4.Text = "Неправильное имя или пароль, пожалуйста, зарегистрируйтесь!";

}

}

catch (Exception ех2)

{

Label5.Text = Label5.Text + "
" + ex2.Message;

}

Подключение.Close();

if (П0ЛЬ30ВАТЕЛЬ_АУТЕНТИФИЦИР0ВАН == true)

// Направляем пользователя на уже разрешенную страницу Response.Redirect("Secret.aspx");

}

protected void Button2_Click(object sender, EventArgs e)

{ // Щелчок на кнопке "Регистрация"

Response.Redirect("Registration.aspx");

}

}

}

Здесь при нажатии пользователем кнопки Готово осуществляется SQL-запрос к базеданных на наличие записи с полями "имя пользователя" и "пароль", получен­ными от TextBox1 и TextBox2. Если такая запись найдена, то делаем вывод, что пользователь аутентифицирован, и направляем его на уже разрешенную для него Wеb-страницу Secret.aspx. Если же запись в базе данных с такими полями (именем и паролем) не найдена, то сообщаем об этом пользователю на метку Label4. Поль­зователь при этом может либо уточнить имя и пароль, либо перейти к процедуре регистрации, нажав кнопку Регистрация.

А что же Web-форма Secret.aspx? Если в ней просто привести закрытую ин­формацию, то недобросовестный пользователь, выяснив адрес этой страницы, очень легко наберет его в адресной строке браузера и получит без нашей санкции доступ к искомой странице, а все наши "умные" регистрации с использованием ба­зы данных окажутся бесполезными. Исходя из этих соображений, добавляем в те­кущий проект (Project | Add New Item | Web Form) новую Web-форму, называем ее Secret.aspx. В эту форму из раздела Standard панели элементов перетаскиваем метку Label и командную кнопку Button. В листинге 13.7 приведен код программ­ной поддержки для файла-разметки Secret.aspx.

Листинг 13.7. Web-форма Secret.aspx

// К этой странице имеют доступ только зарегистрированные пользователи. Вначале пытаемся (Try) определить,

// с какой Web-страницы пришел пользователь на данный ресурс. Если не удается (ветка catch,

// т. е. пользователь пытается открыть данный закрытый ресурс, набрав его URL-адрес в адресной строке

// браузера), то сообщаем пользователю, что он не зарегистрирован, и делаем видимой кнопку "Регистрация".

//Если удается определить URL-адрес страницы, с которой пользователь пришел на данную страницу, то

// разрешаем доступ к закрытой информации только для адресов

// /Login.aspx и /Registration.aspx.

using System;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace Login

{

public partial class Secret : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{ // Обработка события "загрузка страницы"

Button1.Visible = false; Button1.Text = "Регистрация";

string URL_aдpec;

// Определение, с какой Web-страницы вы пришли на данную

// страницу, т. е. определение локального адреса (пути)

try

{

URL_aдpec = Request.UrlReferrer.LocalPath;

// Более эффективно определять абсолюный виртуальный адрес:

// URL_адрес = Request.UrlReferrer.AbsoluteUri

if (URL_адрес == @"/Login.aspx" | |

URL_aдpec == @"/Registration, aspx")

{

Label1.Text = "Поскольку Вы являетесь " +"зарегистрированным пользователем, то Вы имеете " + "доступ к закрытой информации. Вы пришли на эту" + " страницу со страницы " + URL_aflpec;

return;

}

}

catch (Exception ex)

{

Label1.Text = "Вы не являетесь зарегистрированным " +

"пользователем, поскольку пришли на эту страницу, " +
"набрав URL-адрес в адресной строке браузера.
" + ex.Message;

Button1.Visible = true;

return;

}

Label1.Text = "Вы не являетесь зарегистрированным " +

"пользователем, поскольку пришли со страницы " + URL_адрес;

Button1.Visible = true;

}

protected void Button1_Click(object sender, EventArgs e)

{ // Щелчок на кнопке "Регистрация"

Response.Redirect("Registration.aspx");

}

}

}

Как видно из программного кода, используя свойство LocalPath, определяем, с какой Web-страницы пришел пользователь на данную страницу. Причем мы здесь определяем локальный виртуальный адрес, поскольку нам таким образом удобно производить отладку программы, но вообще говоря необходимо определять абсо­лютный вируальный адрес, как показано в комментарии. Далее разрешаем доступ к закрытой информации только пользователям, пришедшим на данную страницу c Web-страниц Registration.aspx или Login.aspx.

Убедиться в работоспособности данных Web-страниц (в рассмотренном примере их три) можно, открыв решение Login.sln в папке Login.

Пример 95. Таблица с переменным числом ячеек, управляемая двумя раскрывающимися списками

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

Программируя поставленную задачу, запустим систему Visaul Studio 2010 и создадим новый проект шаблона Empty ASP.NET Web Application, назовем его tab.sln. К текущему проекту добавим Web-форму. Для этого в пункте меню Project выберем команду Add New Item и в появившемся окне дважды щелкнем по шаб­лону Web Form.

Далее в конструкторе WebForm1.aspx из раздела Standard панели элементов Toolbox в проектируемую форму перенесем элемент управления Table, два рас­крывающихся списка DropDownList, две метки Label и командную кнопку Button. Разместим их на форме, как показано на рис. 13.12. Теперь, используя, например, контекстное меню проекта Web-формы, выберем команду View Code и попадем на вкладку файла программной поддержки WebForm1.aspx.es. В листинге 13.8 при­веден соответствующий программный код.

Листинг 13.8. Таблица с переменным числом ячеек

// Tаблица с переменным числом ячеек, управляемая двумя раскрывающимися списками. Web-страница позволяет с

// помощью двух раскрывающихся списков DropDownList заказать необходимое число рядов и столбцов в таблице,

// а затем строить заказанную таблицу

using System;

using System.Web.UI.WebControls;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace tab

{

public partial class WebForm1: Systern.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

Page.Title = "Укажите размерность таблицы";

if (Page.IsPostBack == true) return;

// Заполнять выпадающий список необходимо при первой загрузке

// страницы IsPostBack = false, иначе будут добавляться новые

// пункты в выпадающей список при каждой перегрузке страницы

DropDownList1.Items.Add("1"); DropDownList1.Items.Add("2"); DropDownList1.Items.Add("3");

DropDownList2.Items.Add("1"); DropDownList2.Items.Add("2"); DropDownList2.Items.Add("3");

Table1.Caption = "Название таблицы";

Table1.CaptionAlign = TableCaptionAlign.Right;

Table1.ToolTip = "Укажи количество рядов и столбцов и нажми кнопку";

Table1. BorderStyle = BorderStyle.Solid;

Table1.GridLines = GridLines.Both;

Label1.Text = "Кол-во строк"; Label2.Text = "Кол-во столбцов";

Button1.Text = "Обновить таблицу";

}

protected void Button1_Click(object sender, EventArgs e)

{

int i, j ;

for (i = 1; i <= int.Parse(DropDownListl.Selectedltem.Value); i++)

{

var РЯД = new TableRow ();

for (j = 1; j <= int.Parse(DropDownList2.Selectedltem.Value); j++)

{

var ЯЧЕЙКА = new TableCell();

ЯЧЕЙКА.Text = "Ряд " + i + ", Кол " + j;

ЯЧЕЙКА.HorizontalAlign = HorizontalAlign.Center;

РЯД.Cells.Add(ЯЧЕЙКА);

}

Table1.Rows.Add(РЯД);

}

}

}

}

Как видно из программного кода, при загрузке страницы Page_Load происходит заполнение значениями раскрывающихся списков DropDownList, причем заполнение осуществляется только при первоначальной загрузке страницы, когда IsPostBack = false. Если бы мы не предусмотрели обход присвоения начальных значений при IsPostBack = true, то значения в списке добавлялись бы каждый раз при очередной перезагрузке страницы. Заметим, что мы могли бы и не контролировать IsPostBack, если бы присвоение начальных значений выполнили в процедуре обработки события инициализации страницы Page_PreInitVisual Studio 2003 это событие называлось Page_Init).

Свойства других элементов управления также инициализированы при обработке события загрузки Web-страницы Page_Load. Мы могли бы это сделать в конструкторе, но для удобства читателя приводим их в программном коде. Назначения этихсвойств очевидны и не требуют дополнительных комментариев.

При обработке события "щелчок на кнопке" Обновить таблицу имеем два вложенных цикла. Параметры обоих циклов i и j изменяются от 1 до значения, выбранного пользователем в соответствующем раскрывающемся списке. Метод int.Parse пространства имен System конвертирует строку из соответствующего свойства объекта DropDownList в переменную типа int. Внешний цикл перебирает ряды таблицы, а внутренний — ячейки таблицы. В теле внешнего цикла очередная итерация создает новый объект ряд класса TableRow, аналогично в теле внутренне­го цикла каждый раз создается новый объект ячейка класса TableCell.

Для старта созданного проекта нажмем клавишу <F5>. В результате получим примерно такое отображение таблицы, как показано на рис. 13.12.

Убедиться в работоспособности Web-страницы можно, открыв решение tab.sln в папке tab.


1   ...   16   17   18   19   20   21   22   23   ...   31


написать администратору сайта