Разработка электроники,
Систем автоматики,
Программного обеспечения
ООО "Антех ПСБ", Санкт-Петербург
+79811865082
anteh@bk.ru
Телеграм: собака antehru
Сайт https://anteh.ru
1. [System.Web.Services.WebMethod]
3. Интерфейс System.Web.UI.IcallbackEventHandler
4. Интерфейс System.Web.UI.IcallbackEventHandler для контрола унаследованного от GridView
Нашёлся только один способ обмена данными между клиентской стороной(web страницей) и контролом расположенным на серверной стороне страницы. Т.е. обмен данными производится не со страницей, а с серверным контролом, расположенном на странице.
Под контролом здесь подразумевается серверный элемент управления.
Приведено 3 случая вызова методов серверной стороны:
1.[System.Web.Services.WebMethod] -вызов методов серверной стороны с клиентской страницы. Прост в реализации. Через POST можно передать любые данные в любом объёме.
2.IHttpHandler -вызов методов серверной стороны с клиентской страницы. Работает быстрее 1го метода. Через POST позволяет передавать любые данные в любом объёме.
3.IcallbackEventHandler позволяет осуществлять обмен данных не только между клиентской и серверной сторонами страницы, но и между клиентской стороной и контролом серверной стороны, размещённом на странице. Используется XmlHTTP. По непроверенным данным позволяет передавать только текстовую информацию, но тут как говориться было бы желание.
Есть и другие способы реализации ajax обмена данными между страницей и сервером. TestICBEH.rar -архив проекта примера для IcallbackEventHandler.
Рассмотрим передачу данных .js скриптом клиентской страницы в серверное представление страницы: 2способа. И в серверный контрол управления, размещённый на странице: 1способ. Главная задумка в том, чтобы данные передавать в сам серверный контрол управления, размещённый на серверной стороне страницы, а не на серверное представление страницы. Страница создана в VS2008 как web приложение, создано два проекта серверных контролов управления, несколько контролов размещено на странице. Данные со страницы на сервер и обратно передаются по клику на каждый из элементов управления.
Рассмотрим передачу данных на серверное представление страницы, содержащее контрол. Рассмотрено 2 способа: через [System.Web.Services.WebMethod] и интерфейс IHttpHandler. Разумеется есть и другие. Если коротко, то через IHttpHandler быстрее, через [WebMethod] проще, но в сам контрол этими методами данные передать не получится. В контрол можно передать данные через реализацию интерфейса ICallbackEventHandler.
Ссылки на источник с примерами и описанием ICallbackEventHandler webform_docallback: http://www.intuit.ru/department/se/aspdotnet/18/4.html
[System.Web.Services.WebMethod]
1.На странице должен присутствовать ScriptManager. В текущем случае это ToolkitScriptManager. В его свойствах параметр EnablePageMethods нужно установить в true. Этим разрешается вызов методов страницы расположенных на серверной стороне, помеченных атрибутом [WebMethod]. В reference нужно добавить System.Web.Services и соответственно using System.Web.Services; или использовать [System.Web.Services.WebMethod]. На скриншоте часть визуального редактора.
Пробовал работоспособность без установки EnablePageMethods -работало.
2. Код .cs. Создаём на серверной стороне статический метод расположенный в классе, описывающем страницу, в текущем случае содержащую контрол/лы. Метод должен быть статическим. Метод помечаем атрибутом [System.Web.Services.WebMethod]:
|
3.Код .js файл:
|
Результат, после нажатия клиентской кнопки следующий:
Передали данные на серверную сторону, данные были обработаны, возвращены клиентской странице и отображены в сообщении. Всё как и должно быть.
Случай обмена данными между DOM элементом страницы и сервером посредством IHttpHandler POST. Данные серверного элемента управления(контрола) расположенного на странице, передаются на серверную сторону представления страницы, содержащую контрол, а не в сам контрол.
1.Создаём файл .ashx -добавляем к проекту Generic Handler. В текущем случае, прямо в корень проекта web-приложения.
2.Принимаем POST запросы, парсим в HashTable, формируем и передаём ответное сообщение. Файл *.ashx редактированию не подлежит. В нём находится единственная строка: "<%@ WebHandler Language="C#" CodeBehind="HandlerEGV.ashx.cs" Class="Monitor12.HandlerEGV" %>" Содержимое *.ashx.cs файла:
|
3.Код .js файл. По нажатию на кнопку производится передача данных на сервер, обработка и последующий приём, с выводом сообщения.
|
Ответное сообщение на запрос с сервера, после нажатия кнопки:
Интерфейс System.Web.UI.IcallbackEventHandler
Передача данных с клиентской страницы на серверную сторону и обратно посредством реализации интерфейса IcallbackEventHandler для создаваемого контрола.
TestICBEH.rar -архив проекта примера для IcallbackEventHandler.
Скриншот тестового примера для интерфейса IcallbackEventHandler. Содержит 3 статически размещённых, через визуальный редактор, кнопки-расширенных серверных контролов, серверный контрол унаследованный от GridView и 2 динамически созданные через jQuery кнопки. Клик по каждому из элементов приводит к передаче данных на сервер, обработку, возврат результата обратно на страницу и отображение в диалоговом окне.
Нужно осуществить следующее: разрабатываем серверный контрол управления. Есть несколько одинаковых контроллов размещённых на странице. Пускай контролом будет кнопка, функциональность которой расширяем. Кнопка динамически создаваемая в контроле. Нужно, чтобы по нажатию на динамически созданную кнопку контрола на сервер передавались некоторые данные, обрабатывались, и возвращались обратно в клиентское представление контрола.
Рассмотрим последовательность действий.
Пускай интерфейс IScriptControl и всё, что к нему полагается уже реализованно. Подключаем интерфейс IcallbackEventHandler. public class tbutt : Button, IScriptControl, ICallbackEventHandler
1.При загрузке страницы, в методе onload контрола на серверной стороне, через Page.ClientScript.GetCallbackEventReference формируется WebForm_DoCallback прототип функции, содержимое в cbReference. Далее в ручную создаём скрипт cbScript. Он описывает функцию UseCallback, вызывающую WebForm_DoCallback для осуществления обратной передачи. Далее регистрируется программно созданный скрипт UseCallback функции.
|
2.Реализуем 2 функции интерфейса IcallbackEventHandler:
|
3.В .js файл добавляем следующее:
|
Здесь: самая верхняя строчка -для работы jQuery intellisence. ProcessResult -функция принимающаяя ответное сообщение от сервера как результат клика по кнопке. UseCallback -та самая функция, формируемая программно в 1. Функция принимает 2 аргумента первый передаваемый на сервер содержит все нужные агрументы, разделённые например '&' для последующего разбора на серверной стороне. Здесь разделение не использовалось. Второй аргумент в текущем случае просто присутствует и нигде не обрабатывается.
В общем процесс выглядит так: по клику на кнопку запускается функция UseCallback, .js скрипт, содержащая первым аргументом передаваемые на сервер данные. Функция контрола-кнопки RaiseCallbackEvent на серверной стороне, принимает данные. Затем добавляет текущее системное время к принятому аргументу. Затем автоматически запускается GetCallbackResult передающая результат клиентскому представлению контрола в .js скрипт -функцию ProcessResult. Функция ProcessResult выводит результат на экран, в виде сообщения с веб-страницы. В проекте реализованы 5 кнопок 3 статических, созданных в визуальном редакторе и 2 динамическая, создаваемая динамически через jQuery.
Реализация текущего проекта VS2008 Framework 3.5.
Скриншоты кликов по статической и динамической кнопкам:
Интерфейс System.Web.UI.IcallbackEventHandler для контрола унаследованного от GridView
В общем предполагал, будут нюансы при реализации IcallbackEventHandler для GridView. Нюансов не было, всё так же, разве пришлось реализовывать ObjectDataSource для GridView -взят кусок кода из другого проекта. Проект в прикреплённом файле.
Скриншот клика по таблице: