среда, 12 марта 2014 г.

Добавляем почти серверные контролы "на лету"

Иногда вы не можете точно сказать сколько вам понадобится контролов для отображения динамических данных. Например, вам нужно сгенерировать меню для отображения вариантов из какого-нибудь текстового конфига. И при этом, вы еще хотите как-то реагировать на события от этих контролов на стороне сервера. На первый взгляд задача кажется, как минимум, не простой. Но, давайте, приглядимся получше.
Итак, у нас есть несколько серверных контролов, у всех них свойство AutoPostBack="true", так как мы хотим как-то реагировать на изменение состояния каждого из них.


Как думаете, во что они превратятся на стороне клиента? На самом деле, в самые банальные HTML-контролы, которые при изменений состояния вызывают JavaScript функцию __doPostBack

Эта функция добавляется в HTML-код страницы автоматически, если на ней есть хоть один серверный контрол. Если же все контролы хотите генерировать самостоятельно, то можете написать что-то типа:


 

  

То есть, в том, чтобы получить чекбокс, который при изменений состояния будет отправлять страницу на сервер, ничего трудного нет. Достаточно написать что-то типа:

           
Response.Write("чекбокс");

            

Теперь переходим к более интересной части - как узнать о существовании этого чекбокса на сервере.

Итак, что нужно сделать, чтобы на стороне сервера отловить это событие изменения состояния чекбокса? Если вы внимательно посмотрите на код функции, __doPostBack, то сразу догадаетесь, что все что нужно сделать, чтобы понять что за контрол вызвал отправку формы это:

                string controlName = Page.Request.Params["__EVENTTARGET"];

А состояние контрола можно получить старым добрым способом:

                string controlState = Request["checkbox1"].ToString();


Комментариев нет:

Отправить комментарий