Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Привязка к данным






Некоторые элементы управления: списки, таблицы и другие — имеют свойство DataSource, которое отвечает за привязку к данным. Тип этого свойства — object, то есть он может быть любым, но должен реализовывать интерфейс IEnumerable. Часто значениями этого свойства назначают коллекции. В таком случае нет нужды добавлять значения вручную. Свойство DataSource может быть привязано к коллекциям, поддерживающим интерфейсы IEnumerable, ICollection или IListSource. Источником данных также могут быть XML-файлы, базы данных. Вызовом метода DataBind данные привязываются к элементу управления. Метод Page.DataBind вызывает привязку данных у всех элементов на странице.

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

void Page_Load() { ArrayList ContinentArrayList = new ArrayList(); ContinentArrayList.Add(" Worldwide"); ContinentArrayList.Add(" America"); ContinentArrayList.Add(" Africa"); ContinentArrayList.Insert(1, " Asia-Pacific"); ContinentDropDownList.DataSource = ContinentArrayList; ContinentDropDownList.DataBind(); } //End Page_Load()....< asp: DropDownList id=" ContinentDropDownList" runat=" server" />

Можно использовать в качестве источника данных хэш-таблицы (Hashtable). Хэш-таблицы — это структуры данных, которые были придуманы давно (см. том 3 " Искусства программирования" Д. Кнута), но программисты долгое время были вынуждены реализовывать их вручную. В языке PHP обычный массив и есть хэш-таблица. В библиотеке STL для языка С++ тоже есть тип map, в котором данные хранятся таким способом. Хэш-таблицы позволяют очень быстро найти значение по ключу. Индекс в коллекции вычисляется как простая хэш-функция ключа. В C# ключи используются как индексаторы. Используйте Hashtable, если в программе часто осуществляется поиск. Вставка и удаление происходят в нем медленно. Ключи могут быть произвольного типа. В классе Object определен виртуальный метод GetHashCode, он и применяется в Hashtable:

< %@ Page Language=" C#" %> <! DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN" " https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > < script runat=" server" > void calSelectChange(Object sender, EventArgs e){ lblShow.Visible = false; Hashtable hshDays = new Hashtable(); hshDays[Convert.ToDateTime(" 2/6/2006")] = " Экзамен по алгеб-ре"; hshDays[Convert.ToDateTime(" 3/6/2006")] = " Экзамен по С#"; hshDays[Convert.ToDateTime(" 4/6/2006")] = " Начало изучения курса ASP.NET"; hshDays[Convert.ToDateTime(" 1/6/2006")] = " День защиты де-тей"; DateTime datDateIn; datDateIn = calDays.SelectedDate; if (Page.IsPostBack) { lblShow.Text = " На этот день назначен: "; lblShow.Text += hshDays[datDateIn]; if (hshDays[datDateIn] == null) lblShow.Text = " Ничего не назначено"; lblShow.Visible = true; }}< /script> < html xmlns=" https://www.w3.org/1999/xhtml" > < head runat=" server" > < title> Попробуем хэш-таблицу< /title> < /head> < body> < form id=" form1" runat=" server" > < div> < h3> Ежедневник< /h3> Введите дату между 1/6/2006 и 30/6/2006< asp: Calendar id=" calDays" runat=" server" OnSelectionChanged=" calSelectChange" VisibleDate=" 06/06/2006" > < /asp: Calendar> < br /> < br /> < asp: Label id=" lblShow" runat=" server" > < /asp: Label> < /div> < /form> < /body> < /html>

Здесь ключом хэш-таблицы является дата. Convert.ToDateTime конвертирует строку в тип даты. VisibleDate гарантирует, что на календаре будет июнь 2006 года. Если значений по ключу в таблице нет, то индексатор просто возвращает null. Значения можно вводить в любом порядке.

Хотелось бы добавить в страницу новую возможность введения новых записей. Можно ввести новые элементы управления — строку ввода и кнопку для подачи данных. При обработке нажатия на кнопку добавим в хэш-таблицу новое значение:

void Button1_Click(object sender, EventArgs e) { hshDays[calDays.SelectedDate]=TextBox1.Text; }

Эта страница не работает. Дело в том, что страница загружается заново, когда меняется дата. Хэш-таблица создается заново, и введенные в нее значения теряются. Как же решить эту проблему? Сделаем хэш-таблицу статической переменной:

static Hashtable hshDays; void calSelectChange(Object sender, EventArgs e){ DateTime datDateIn = calDays.SelectedDate; lblShow.Text = " На этот день назначен: "; lblShow.Text += hshDays[datDateIn]; if (hshDays[datDateIn] == " ") lblShow.Text = " Ничего не назначено"; }void Page_Init(){ if (! Page.IsPostBack) { hshDays=new Hashtable(); hshDays[Convert.ToDateTime(" 2/6/2006")] = " Экзамен по ал-гебре"; hshDays[Convert.ToDateTime(" 3/6/2006")] = " Экзамен по С#"; hshDays[Convert.ToDateTime(" 4/6/2006")] = " Начало изуче-ния курса ASP.NET"; hshDays[Convert.ToDateTime(" 1/6/2006")] = " День защиты детей"; Session[" Diary" ]= hshDays; }} void Record(Object sender, EventArgs e){ DateTime datDateIn = calDays.SelectedDate; hshDays[datDateIn]= Entrance.Text; lblShow.Text = hshDays[datDateIn].ToString(); }

Классы проверки данных (валидаторы)

Данные из форм обычно записываются в базы данных, и тип информации в них должен соответствовать типу и длине данных в полях таблиц баз данных. Кроме того, иногда нужно вводить взаимосвязанные данные, например, пароль во время регистрации нужно вводить 2 раза и он в обоих полях должен совпадать. Некоторые хакеры пытаются вводить в формы программные коды, чтобы взломать вашу систему. Бдительность и еще раз бдительность, как говорил товарищ... не помню кто. А если пользователь ввел неверные данные случайно, сервер выдаст непонятное сообщение об ошибке, и ценный клиент уйдет с нашего сайта на другой.

Прежде чем работать с данными, нужно убедиться, что:

  • в определенное поле введена информация;
  • текст в поле " Адрес" имеет форму электронного адреса (с @ и с точкой);
  • дата рождения разумна, например, пользователь не сообщил о себе, что ему 300 лет или 1 годик;
  • пароль достаточно сложен и не совпадает с логином.

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

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

Получить доступ к валидаторам просто — раскройте в Toolbox вкладку " Validation".

Классы валидаторов образуют иерархию, во главе которой стоит абстрактный класс BaseValidator.



Рис. 5.1.

Базовый класс валидаторов сам наследник класса Label, так что по существу все валидаторы — метки, текст в которых становится видимым, когда не выполняются заданные нами условия проверки. По умолчанию текст в валидаторах — красный (вспомните школу и замечания учительницы в тетради). Но, конечно же, этот цвет можно поменять на более приятный. Все валидаторы имеют свойство ControlToValidate. Оно задает тот элемент управления, данные в котором проверяются данным валидатором. Этот элемент должен находиться в одном контейнере с валидатором.

Общие свойства валидаторов
Display Предоставлять ли место статически или динамически
EnableClientScript Разрешать ли генерировать клиентский код
ErrorMessage Текст сообщения об ошибке
IsValid Прошел ли валидацию связанный с валидатором элемент управления





© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.