проф. В.К.Толстых, Технологии разработки Internet- приложений ASP.NET приложения – работа с формами Из цикла лекций «Технологии разработки Internet-приложений» для студентов 4-го курса кафедры Компьютерных технологий физического факультета Донецкого национального университета
Форма – класс HtmlForm Страница может иметь только одну видимую серверную форму. Несеверных (без атрибута runat=server ) и невидимых (атрибут visible=false ) форм может быть сколько угодно. Страница выполняет возврат формы самой себе, серверная форма не может иметь атрибут action и name. Несерверные формы могут поддерживать технологию ASP, но не ASP.NET. По умолчанию атрибут method=POST, при использовании method=GET необходимо помнить, что строка запроса в заголовке HTTP ограничена 2 Килобайтами. Наиболее развитый элемент для работы с формами Сюда помещается всё содержимое страницы
Свойства формы СвойствоОписание Attributes Унаследовано от Control, возвращает коллекцию имен и значений атрибутов тэга ClientID Унаследовано от Control, возвращает значение свойства UniqueID Controls Унаследовано от Control, возвращает объект-коллекцию дочерних элементов формы DefaultButton Строковое свойство, возвращает и позволяет задать кнопочный элемент управления, который будет используемым по умолчанию элементом формы. DefaultFocus Строковое свойство, возвращает и позволяет задать кнопочный элемент управления, который получит фокус ввода при отображении формы. Disabled Возвращает и позволяет задать булево значение, указывающее отключена ли форма. Соответствует HTML-атрибут disabled EncType Возвращает и позволяет задать тип кодировки. Соответствует HTML-атрибут enctype ID Унаследовано от Control, возвращает и позволяет задать программный идентификатор формы InnerHTML Унаследовано от HtmlContainerControl, возвращает и позволяет задать контент разметки, содержащийся между открывающимися и закрывающимися тегами формы InnerText Унаследовано от HtmlContainerControl, возвращает и позволяет задать текст, содержащийся между открывающимися и закрывающимися тегами формы
СвойствоОписание Method Возвращает и позволяет задать значение, указывающее как браузер возвращает данные формы серверу. По умолчанию это свойство имеет значение POST; при желании ему можно присвоить значение GET Name Возвращает значение свойства UniqueID Style Возвращает коллекцию CSS-свойств формы SubmitDisabled Controls Указывает, следует ли дать отключенным на клиенте элементам управления указание предоставить свои значения для включения в состав возвращаемых данных, чтобы эти значения сохранились после возврата формы. По умолчанию имеет значение false. TagName Возвращает значение «form» Target Возвращает и позволяет задать имя фрейма или окна для сгенерированной HTMLстраницы UniqueID Унаследовано от Control, возвращает уникальное, полностью уточненное имя формы Visible Возвращает и позволяет задать значение, указывающее должен ли осуществляться рендеринг формы. Если свойство имеет значение false, рендеринг формы с выводом результирующего HTML-кода не производится Продолжение
Методы формы МетодОписание ApplyStyleSheetSkin Применяет стилевые свойства, определенные в таблице стилей страницы. В АSP.NET 1.x данный метод не поддерживается DataBind Вызывается для всех дочерних элементов управления метод DataBind FindControl Возвращает элемент управления с заданным идентификатором Focus Присваивает элементу управления фокус ввода. HasControls Указывает, содержит ли форма дочерние элементы управления RenderControl Выводит HTML-код формы. Если используется трассировка, кэширует трассировочную информацию, которая будет выведена позднее, в конце страницы
Обработка данных формы Для отправки данных формы на сервер необходимо вовнутрь формы поместить любой элемент, реализующий обращение к серверу, например, кнопку Данные формы, по умолчанию, возвращаются POST-методом на сервер той же самой.aspx -странице (постинг), что и создавала текущую форму. Извлечение и обработка полученных данных, осуществляется в момент повторных загрузок.aspx - страницы, т.е. внутри обработчика события Page_Load при состоянии страницы IsPostback = true. После Page_Load данные могут обрабатываться в обработчиках событий, сгенерированных нажатием кнопки и т.п. Извлечение данных из элементов управления формы осуществляется простым обращением к свойствам соответствующих идентификаторов этих элементов, например, txt = TextBox1.Text; protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) // При повторной и последующих загрузках данной стрнаицы... { Response.Write(" Спасибо, " + TextBox1.Text + " "); } Пример Клиент получит обратно ту же форму в начале которой будет фраза: Спасибо, «данные из TextBox1»
Межстраничный постинг возврат POST-данных другой странице В ASP.NET имеется встроенный механизм, позволяющий изменить стандартный цикл обработки страницы и тем самым помешать ей вернуть данные самой себе. Возврат данных из формы одной страницы на другую страницу называется межстраничным постингом. Он может быть организован, например, кнопкой или ссылкой в.aspx - странице при помощи атрибута PostBackUrl = " адрес новой.aspx -страницы ". Возможно также использование метода Server. Transfer (см. далее). Для доступа на новой странице к состояниям всех элементов управления предыдущей страницы, выполнившей постинг, можно использовать свойство PreviousPage класса Page. Если межстраничный постинг реализуется через PostBackUrl, то в HTML-коде страницы создается скрытое поле _PREVIOUSPAGE, через которое и передаётся информация о состоянии элементов текущей формы на новую страницу. Эта информация доступна странице-получателю через свойство PreviousPage. Например, для извлечения элемента TextBox1 предыдущей формы в переменную txt типа TextBox новой формы необходимо написать: TextBox txt = (TextBox)PreviousPage.FindControl("TextBox1"); Далее можно извлечь текст из элемента txt и вывести его на новую форму, например, при помощи метки: Label1.Text = txt.Text; Обращаем внимание, что метод PreviousPage.FindControl() ищет элементы только корневого контейнера страницы, но не ищет элементы вложенных контейнеров.
Использование контейнеров из PreviousPage Page prevPage = (Page)PreviousPage; foreach (Control child1 in prevPage.Controls) { if (child1.ID == "MyControl") { Label1.Text = ((DropDownList)child1).SelectedValue; break; } else { foreach (Control child2 in child1.Controls) … if (childN.ID == "MyControl") { Label1.Text = ((DropDownList)childN).SelectedValue; break; } … } Если Вам не известна контейнерная структура страницы, осуществившей перенаправление, но Вы знаете, что там должен быть нужный Вам элемент, например, DropDownList c id="MyControl", то его поиск можно организовать перебором всех контейнеров (на ограниченную глубину N) и их элементов: Пример 1
Использование MasterPage из PreviousPage Page prevPage = (Page)PreviousPage; HtmlForm* child1 = (HtmlForm)prevPage.Form; ContentPlaceHolder child2 = (ContentPlaceHolder)child1.FindControl("ContentPlaceHolder1"); Panel child3 = (Panel)child2.FindControl("Panel1"); DropDownList child4 = (DropDownList)child3.FindControl("MyControl"); if (child4 != null) {Label1.Text = child4.SelectedValue; } *- using System.Web.UI.HtmlControls; Если Вам известна контейнерная структура страницы, осуществившей перенаправление, и известны идентификаторы этих контейнеров, то доступ к элементу предыдущей страницы может иметь следующий вид. Пусть предыдущая страница использует эталонную страницу MasterPage, которая всегда содержит ContentPlaceHolder, в нём панель Panel1, а не ней – искомый выпадающий список MyControl тогда: Пример 2 Для доступа к элементам MasterPge необходимо обращаться через форму HtmlForm и контейнер содержания ContentPlaceHolder эталонной страницы
Доступ к предыдущей странице через PreviousPageType Самый распространенный и универсальный способ доступа к свойствам элементов управления на предыдущей странице – это использование доступа через FindControl. Однако, можно получить и прямой доступ к открытым свойствам элементов через PreviousPageType, например: Используя этот атрибут на странице SecondPage.aspx, вы можете привести тип объекта PreviousPage к типу FirstPage. Несмотря на это, вы не сможете написать строку типа PreviousPage.CheckBox1.Text. Дело в том, что все элементы управления объявляются с модификатором private, а следовательно к ним нельзя получить доступ напрямую. Тем не менее вы можете объявить для нужных элементах открытые свойства, например: public string CheckBox1Text { get ( return CheckBox1.Text; ) } Теперь к этому свойству элемента можно обращаться напрямую на странице SecondPage.aspx : string s = PreviousPage.CheckBox1Text; Подобный подход с PreviousPageType, хоть и обладает преимуществом, облегчающим доступ к элементам предыдущей страницы, все же лишен гибкости. Так, если на одну и ту же страницу возможен переход сразу с нескольких страниц, то применение PreviousPageType становится невозможным. Открываем доступ к переменной CheckBox1Text в классе предыдущей страницы
Использование экземпляра предыдущей Web-формы Аналогично предыдущему слайду, на новой странице можно создать экземпляр предыдущей Web-формы и получить простой доступ к открытым свойствам элементов и переменным предыдущей страницы. Пусть предыдущая страница имела такие данные: public partial class _Default1 : System.Web.UI.Page { public string TextBox1Value { get; private set; }... protected void Button1_Click(object sender, EventArgs e) { TextBox1Value = TextBox1.Text; Server.Transfer("~/_Default2.aspx"); } Пример 3 public partial class _Default2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { _Default1 form1 = (_Default1)PreviousPage; this.Label1.Text = form1.TextBox1Value; } Открываем доступ к переменной TextBox1Value
Существуют ещё один механизм межстраничного постинга – это метод: Server.Transfer( "~/… новая страница.aspx " ) Перенаправление осуществляется на сервере. В браузера клиента не отображается URL-адрес новой страницы. После этого метода никакой код текущей страницы не выполняется, однако, всё, что было до этого выполнено будет встроено в ответ клиенту вместе с HTML-потоком от новой страницы. Компоненты и их значения на старой странице будут доступны и на новой странице через свойство PreviousPage. Обе страницы (отправляющая и получающая) должны принадлежать одному приложению с виртуальным адресом "~/…". Метод Transfer может содержать второй булевский параметр, указывающий надо ли очищать предыдущие коллекции QueryString и Form. Перенаправление браузером клиента : Response.Redirect("новая страница.aspx ") Работает как обычная гиперссылка, активизированная на стороне клиента и не является межстраничным постингом. Если планируется постоянное автоматическое перенаправление клиента на другую страницу, например, если текущая страница или её имя меняются, то лучше использовать метод Response.RedirectPermanent("новая страница.aspx ") Он возвращает клиенту HTTP-статус 301 – Moved Permanently, а поисковые системы «подменяют» старую страницу в свой базе на новую и больше старую страницу не запрашивают. Метод Response.Redirect выдает 302 – Moved Temporary. Перенаправление пользователя на другую страницу
Примеры обработки данных форм СлайдыСлайды примера «Обработка данных форм» Приложение Приложение «Обработка данных форм»
Страница с несколькими формами – элементы MultiView и Wizard СлайдыСлайды примера «Элементы управления MultiView и Wizard» Приложение Приложение «Элементы управления MultiView и Wizard»