HTML Decode/Encode.

Если кто-то слышал об такой атаке на веб-сайты, как XSS Injection, то он(она) знает что для предотвращение такой атаки необходимо использовать функции HtmlEncode/HtmlDecode. XSS Injection (Cross-site injection) - один из способов атак веб-приложений, главной идеей которого является вставка(инъекция) чужого javascript-кода на атакуемый веб-сайт. Как минимум, это может привести к краже печенек cookies и получении прав администратора сайта. ...

1.1. ASP.NET

Это происходит, примерно, так:
Допустим, у нас есть форма для отправки комментарием, где пользователь вводит свой еmail и текст коммеентария. Самый простой обработчик кнопки добавить окмментарий будет выглядить так:

protected void OnAddCommentClick(object sender, EventArgs e)
{
 var pageId = this.GetPageId();
 var email = this.txtEmail.Text;
 var comment = this.txtComment.Text;
 CommentsService.AddComment(pageId, email, comment);
}

С первой точки зрения этот код не содержит никаких ошибок, компилируется и корректно сохраняет данные в БД. Но, если в тексте  комментария будет любой HTML или JavaScript-код, то при отображении этого комментария на страницу без предварительной обработки мы увидем, что HTML и JavaScript-код без особых проблем обрабатываются браузером.
Таким образом, мы сделали наш сайт уязвимым и нарушили одно из базовых правил проектирования ПО: “Не доверять данным, которые пришли извне нашей системы”. От себя еще добавлю: вдвойне недоверять данным, которые были введенны пользователем. Чтобы исправить это ошибку, необходимо всего-лишь вызвать метод HttpServerUtility.HtmlEncode(), перед сохранением данных в базу:


 var email = Server.HtmlEncode(this.txtEmail.Text);
 var comment = Server.HtmlEncode(this.txtComment.Text);

После чего, строка вида “<script>alert(‘hello!’);</script>” будет сохранена в базу в таком виде:

 &lt;script&gt;alert(‘hello!’);&lt;/script&gt;

Теперь все хорошо: любой введенный пользователем текст не ламает нашу верстку и не вызывает выполнения стороннего javascript (пример 2).
Но все не так просто, как кажется. Теперь, если такой код вставить в обработчике OnAddPage(), где администратор сайта будет добавлять страницы, то вместо красивого текста пользователи увидят набор непонятных символов. Поэтому, при отображении содержимого страницы мы вызываем метод HttpServerUtility.HtmlDecode(), который переведет сохраненный в базе данных текст в такой вид, чтобы браузер его корректно обрабатывал.

Таким образом, мы избавили наш сайт от XSS Injection дали возможность пользователям воодить разнообразные данные без вреда для сайта.

Примечание. Во всех примерах выше свойство странице EnableRequestValidation было установлено в false для возможноти ввода символов “<“ и “>”.
Примечание для ASP.NET 4.0/ASP.NET MVC 2.0. В ASP.NET 4.0/ASP.NET MVC 2.0 появилась конструкция <%: ... %>, которая делает за нас HTML Decode/Encode.

1.2. JavaScript

Если нам необходимо реализовать данную функциональность на клиенте с помощью javascript, то нам на помощь приходит jQuery:

function htmlEncode(html) {
 return $('<div/>').text(html).html();
}
function htmlDecode(text) {
 return $('<div/>').html(text).text();
}

1.3 Python/Django

В фреймворке Django HTML Decode работает по умолчанию, и для его отключение в шаблоне (template) добавить блок {% autoescape off %} и в нем поместить все элементы, для которых нам не нужен HTML Decode, после чего закрыть блок с помощью {% endautoescape %}.

2. URL Decode/Encode.

В отличии от HTML Encode/Decode незаэкранированный url больших проблем не вызывает, за исключением двух моментов: url становится не таким простым и понятным для пользователя и это не очень хорошо влияет на SEO.

2.1 ASP.NET

Рассмотрим такую ситуацию: у нас есть сайт с функцией поиска по нем. Стандартная форма поиска содержит поле для вводи и кнопу "Поиск". В простейшем случае при нажатии на кнопку “Поиск” у нас есть такой обработчик:


protected void OnSerachClick(object sender, EventArgs e)
{
 var searchText = this.txtSearch.Text;
 car url = String.Format(“{0}?q={1}”, VirtualPathUtility.ToAbsoluteUrl(“~/Search.aspx”), searchText);
 Response.Redirect(url);
}

Вполне рабочий код, за исключением того, что в некоторых случаях в итоге мы получаем не очень красивый url вида:

/Search.aspx?q=some%20keywords

Конечно, такой url правильно обрабатывается браузером, но не всем пользователям будет понятно что он значит. Происходит это из-за того, что браузер автоматически заменяет символ пробела и ряд других символов на  их шестнадцатиричное значение вида %XX, где XX - код символа в шестнадцатиричной системе.
Сделано это было давно, кода браузеры были маленкими еще не умели отображать нелатинские символы в строке ввода адреса и для правильного отображения разнообразных символов.
И тут нам на помощь приходят методы HttpServerUtility.UrlEncode() и HttpServerUtility.UrlDecode() которые предназначены для переобразования параметров строки запроса в понятный для пользователей вид. Отдельно отчему, что эти методы предназначены для обработки исключительно параметров url, а для переобразования адреса к необходимому ресурсу существует метод HttpServerUtility.UrlPathEncode(), работа которого больше похожа на работу метода HttpServerUtility.HtmlEncode(), но учитывает все особенности построения url. Этот метод не имеет метода для обратного переобразования, но при правильном подходе к проектированию приложенич это не понадобится.

2.2. JavaScript

Аналог URL Encode в javascript - функция encodeURI()


В декабре прошлого года я написал пост по названием “Программирование на .NET: С чего начать?” на тему того, чтобы почитать начинающим разработчикам на платформе .NET. С того момента прошло достаточное количество времени и могло появиться желание или необходимость, начать писать веб-приложения на основе технологиеи ASP.NET. Не важно, будет это ASP.NET Webforms или ASP.NET MVC - в любом случаем, знание одной технологии не мешает познакомиться с другой. Далее я приведу список книг/блогов, которые рекомендую для знакомства с веб-разработкой на основе .NET Framework.

  • Начну с книги Дино Эспозито “Introducing Microsoft ASP.Net 2.0” - отличное введение в ASP.NET 2.0. Несмотря на то, что этот замечательный автор уже написал книгу по ASP.NET 3.5, эта книга не теряет соей актуальности и служит отличным введением в мир веб-разработки на основе технологий от Microsoft.
  • Книга “Programming Microsoft ASP.NET 3.5" является хорошим продлолжением предыдущей и не нуждается в комментариях. Добавлю лишь одно: некоторые считают что эти две книги все-равно что книга Дж. Рихтера CLR via C#.
  • Marco Bellinaso, “ASP.NET 2.0 Website Programming: Problem - Design - Solution” - книга, которая почетное место на моей книжной полке. Книга описывает процесс создания сайта под названием BeerHouse Project от начала и до конца. Если что-то непонятно, то всегда можно посмотреть исходники этого проекта. Отличная книга для начинающих, чтобы познакомиться с процессом создания сайта от начала и до конца.
  • Следующая книга от сразу двух авторов Matthew MacDonald и Adam Freeman имеет название “Pro ASP.NET 4 in C# 2010”. Я читал более старое название про ASP.NET 2.0. В книге достаточно подробно описывается технология ASP.NET, но читать ее нужно когда базовые знания уже есть.

Технология ASP.NET MVC более молодая и выбор книг значительно меньше. Большинство из них написаны про первую версию этого фреймворки и из-за значительных изменений настоятельно рекомендую читать книги по актуальной на сегодняшний день версии 2.0.
Это такие книги, как:

  • "Pro ASP.NET MVC 2 Framework" от Steven Sanderson - очень подробно и понятно написаны как основы, так и достаточно продвинутые вещи о ASP.NET MVC.
  • "ASP.NET MVC 2 in Action" ) от сразу пяти авторов. Если коротко, то я еще не встречал ни одной книги из этой серии, которая бы меня не заинтересовали и после прочтения которой я бы пожалел о потраченном времени.
  • Еще есть книга “ASP.NET MVC Framework” по ASP.NET MVC 2.0 от русских авторов Гайдара Магданурова и Владимира Юнева. Т.к. книгу только пролистал на балке, то никаких комметариев о ней писать не буду за исключением того, что она вполне годиться для введения в данную технологию.

С книгами закончили, теперь пройдемся по списку веб-ресурсов, RSS которых я регулярно читаю:

  • Сайт http://www.asp.net/ от Microsoft. Название говорит само за себя. Отличный ресурс с форумами, блогами, вики, ссылками на различные opensource приложения. Отдельно хочу выделить раздел с обучающим видео. Это лучше увидеть самому! Единственным их недостатком является то, что они могут ввести в ошибочное заблуждение, что разработка любого сайта - очень и очень простое занятие. В остальном - обязательно смотреть начинающим веб-разработчикам.
  • http://weblogs.asp.net/scottgu/ - блог Скота Гатри. Его должность решил не переводить, а процитировать с его блога:
    "My name is Scott Guthrie, and I am a Corporate Vice President in the Microsoft Developer Division. I run the development teams that build the following products/technologies: CLR and the core .NET Base Class Libraries, ASP.NET, Silverlight, WPF, IIS 7.0, Visual Studio Tools for ASP.NET, WPF, Silverlight and Mobile". Отличные технические посты о самых новых технологиях! Очень часто после публикации очередного поста проходит не одна неделя/месяц до того, как очередная технология/приложение станет доступным для разработчиков.
  • http://dev.net.ua/ и http://msug.vn.ua/ - сайты харьковской и винницкой .NET User Group - не только об asp.net, но и о других технологиях Microsoft.
  • http://www.nikhilk.net/ - Nikhil Kothari's Weblog - блог разработчика из Microsoft, посвященный веб-технологиям.
  • И последнее: MSDN - без него сложно представить жизь разработчика.

Продолжение следует. В следующем посте из серии для начинающих (веб)разработчиков я расскажу о том, что необходимо знать любому разработчику на платформе ASP.NET.


Те, кто с помощью jQuery написал уже не одну сотню, а может и тысячу строк javascript-кода, в этом посте врядли найдут много нового и/или интересного. Пост рассчитан на разработчиков, которые только начинают знакомиться со всей мощью бтблиотеки jQuery. В нем я дам несколько примеров скриптов, которые я время от времени использую с небольшим количеством изменений или вообще без таковых.

[Добавлено перед публикацией поста]
Все примеры достаточно просты, большинство (5 штук!) взяты из документации, но они активно используются мной и я решил сделать пост-заметку для себя. Может, еще кому-то будет полезно. Те, кто не использует jQuery либо другую библиотеку (еще остались такие?) поймут, что эти несколько строк кода в каждом примере иногда заменяют десятки строк кода на javascript’е без использования сторонних библиотек и своих велосипедов.
[/Добавлено перед публикацией поста]

  • Прочитать и/или изменить значение нужного атрибута в элемента DOM-модели:
    var value = $("#element").attr("custimAttribute");
    и
    $("#element").attr("custimAttribute")=”some text”;
  • Тоже самое, но для классов:
    методы .addClass() (http://api.jquery.com/addClass/) и .removeClass() (http://api.jquery.com/removeClass/
  • Сделать подсветку всех картинок на странице по заданному параметру (имя класса):
    $(".image").mouseover(function () {
        $(this).css("border-width", "2px");
        $(this).css("border-style", "solid");
        $(this).css("border-color", "#1b5790");
    });
  • Сделать какие-либо действия над коллекцией объектов:
    $.each([52, 97], function(index, value) {
        alert(index + : + value);
    });

    http://api.jquery.com/jQuery.each/
  • Присвоить tabIndex для всех элементов ввода на форме:
    $(function(){
        var tabindex = 1;
        $(input,select).each(function() {
             if (this.type != "hidden") {
                  var $input = $(this);
                  $input.attr("tabindex", tabindex);
                  tabindex++; 
             }
        });
     });

    http://greatwebguy.com/programming/dom/setting-your-tabindex-on-your-html-forms-automatically-with-jquery/
  • Отправить AJAX-запрос на сервер:
    как ни странно, но примеры из документации http://api.jquery.com/category/ajax/ достаточно работоспособны чтобы использовать их практически без изменений (ссылку на службу все-таки прийдется подставить свою).
  • Создать start-up скрипт на странице (без использования ScriptManager, входящего в состав ASP.NET):
    $(document).ready(function () {
         alert (hello);
    });

 


Когда приложение работает в дебаггере, но не работает в релизной сборке и/или не тестовом сервере - достаточно частое явление, а вот чтоб наоборот - значительно реже. Вернее я на днях с этим столкнулся чуть ли не в первые.

Ситуация была довольно таки простая: есть некий wizard, шаги которого хранятся в поле типа Stack для удобного перемещения вперёд-назад. Естественно, в зависимости от текущего номера шага, нужно было выполнять определённые действия. И вот, после очередного багфикса, пришлось с помощь дебаггера разбираться что же там происходит... Но, при дебагге время от времени (в начале мне было абсолютно непонятно из-за чего это происходит) я получал: System.InvalidOperationException: Stack empty. И это при том, что без дебаггера всё работало! Чтоб разобраться в чем дело, я решил написать маленькое консольное приложение (исходники, как всегда, прикреплены к посту), которое состояло из объявления стека, его наполнения и свойства класса StackItem:

 

Те, кто сталкивался с этим раньше, наверное, уже поняли в чем проблема. Запускаем дебаггер, и после наполнения стека смотрим значения свойства StackItem:

 

Второй раз смотрим значения свойства StackItem:

И здесь произошло самое интересное: при просмотре значения свойства дебаггер выполняет весь код, который находится в конструкции get. Таким образом, при каждом просмотре зачения свойства StackItem, в нашем стеке находилось все меньше и меньше данных. Возможно, для кого-то этот подход и является вполне логичным и очевидным, но не для меня. Ведь могли же в Microsoft предусмотреть это? Но нет, теперь у нас есть такая фича дебаггера, или баг...

А пока, для дебагга подобного кода, приходится использовать конструкцию вида:

 

В этом случае, если переменной i не присвоить другого значения, но она всегда будет хранить в себе число 5.

P.S. Проверял как в VS2008, так и в VS2010. Скорее всего, это фича такая...

DebuggerTest.rar (2.74 kb)


В связи с тем, что я повсеместно пытаюсь избавиться от ASP.NET AJAX Control Toolkit (ACT) и перейти на использование jQuery, то от использования Hover Extender от ACT пришлось отказаться. Сразу же было найдено большое количество разнообразных плагинов для jQuery, но большинство из них имели недостаточную реализацию, из-за чегоостановился на jQuery plugin EZPZ Tooltip.

Из основных достоинств данного плагина хочется выделить:

  • "Чистый" HTML - не нужно добавлять специальные атрибуты для элементов, плагин завязывается на отдельный HTML элемент.
  • Конфигурация через наименование (Convention over configuration) - поведение элементов зависит от из ID.
  • Гибкие настройки - с помощью CSS можно настроить как внешний вид контрола, так и его позиционирование.
  • Возможность замены стандартных эффектов путем перехвата соответствующих событий на jQuery.
  • Удобство и простота работы.
  • Маленький размер - 4.5K в сжатов виде.

Более подробно о всем этом можно почитать на странице проекта, а я хочу рассказать как можно его использовать в связке с ASP.NET на примере простого UserControl.

Для инициализации контрола нужно выполнить небольшой javascript:

$("#example-target-1").ezpz_tooltip();
или
$("#target").ezpz_tooltip({contentId:"content"}); - В случае если у наших HTML-элементов будут "нестандартные" для этого контрола ID.

Так как, ASP.NET сам генерирует нам ClientID элементов (я не учитываю специфику ASP.NET 4.0, где можно отключать автоматическую генерацию ClientID), то приходится использовать 2-й вариант таки образом:

 

При этом у нас:

  •  TargetControlId - ID элемента, при наведении на который будет отображаться наш hover (tooltip).
  • ContainerClientId - ID элемента который будет показываться в качестве hover (tooltip).

 Разметка нашего user control выглядит так:

 

Нам остаётся только разместить наш UserControl на странице и подключить необходимые стили и скрипты. Можно ещё сделать WebControl, но это уже зависит от конкретной задачи. В моём случае UserControl был предпочтительнее.

HoverControl.zip (31.35 kb)


DevConf 2010

Published 5/16/2010 by e0ne in Python | Web Development

DevConf 2010 уже завтра. До поезда в Москву осталось чуть более 3-х часов. Посмотрел финальную програму и немного расстроился: даже не смотря на то, что едем мы вдвоём, из-за плотного расспеисания и немкольких паралельных потоков врядли получится попасть на все интересующие доклады :(. Надеюсь что организаторы запишут и выложут видео.


В прошлую субботу в запорожье прошел семинар "Бизнес в интернете: практика создания и продвижения интернет-магазина", который я посетил с моими друзьями из Compik'a. Сразу же хочется отметить неудобный график поездов из Харькова: мы приехали в Запорожье, примерно, в 3:30 утра(ночи) и почти до 8 утра сидели на вокзале. Соответственно на протяжении большей части семинара усталость и плохой сон давали о себе знать.

Дня за 4-5 организаторы у себя на сайте написали новость, что осталось всего 5 мест. Как оказалось, это был хороший рекламный ход, т.к. в помещение, где всё и происходило, вполне комфортно могло бы поместиться ещё 10-15 человек. Говоря о помещении хочется сказать что оно не сильно подходило для работы проектора: было слишком светло, а окна были без занавесок. Ещё из недостатков организации был то что докладчикам приходилось подавать какие-то знаки для того, чтоб им переключали слайды и не все были готовы к тому, что презентации будут показываться с помощью google docs. Ещё маленикий осадок оставило то, что программу семинара незначительно сдвинули по времени (5-10 минут) из-за чего мой органайзер напоминал о докладах не в то время.

Что касается докладов, то:

 

  1. Первый был про "Интернет-магазин на "1С-Битрикс"". Так как 1С меня не интересует, то слушал я его не особо внимательно и писать об этом ничего не буду.
  2. "Система контроля качества магазинов в Яндекс.Маркете". Яндекс, как всегда на высоте. Интересная программа, хорошая подготовка и квалификация докладчика, которым был Козаченко Андрей, руководитель коммерческого отдела Яндекс.Украина. Несколько основных моментов, которые я выделил для себя:
    • 4.3 тысячи украинских магазинов;
    • более 10 млн товаров;
    • цена на товары только в гривне, но при этом магазин моет экспортировать свой прайс в USD и указывать желаемый курс;
    • результаты поиска в Яндекс.Маркете учитывают геотаргетинг пользователей.
    • Яндекс.Маркет очень хорошо всё модерирует.
  3. Следующий доклад был от представителя ПриватБанка и назывался "API – готовые решения для бизнеса и коммуникации в Интернет".
    Тут я ожидал услышать что-то об использовании API ПриватБанка для подключения платежей у себя на сайте, но мне не повезло. Был скучный и неинтересный доклад о каки-то проектах (linqpay.com, drysms.com и др.), которые используются ПриватБанком у себя и которые легко подключить на своем сайте. Ну не интересно мне слышать какую wiki-систему вместо CMS мне использовать и как она интегрируется с API ПриватБанка, о котором, к слому, так ничего сказано и не было.
  4. "Кейс: создание и продвижение запорожского интернет-магазина".
    Доклад из серии вот мы создали интернет-магазин, у которого в нашем городе почти нет конкурентов и как мы его раскручивали без денег. Возможно, для Запорожья это актуально, но для таких городов как Харьков и Киев - нет. Итого: реклама магазина цветов для помтеителей  семинара без никакой пользы от услышанного. 
  5. "Интернет-магазин: нюансы разработки". Доклад разработчика про использования "самых популярных" CMS для создания интернет-магазина. Мало того, что популярность этих CMS у меня вызвала сомнения, т.к. я о них ни разу не слышал, так ещё уровень докладчика мне не понравился. No comments.
  6. Доклад Романа Доброновского на тему "Повышение конверсии посадочных страниц (landing pages) интернет-магазина" вызвал много вопросов и натолкнул на несколько полезных идей как для интернет-магазина, так и для любого сайта. Почему-то, заметок об этом докладе у меня всего 2 шт. Наверное, остальное время я очень внимательно слушал и ничего не "конспектировал". Тема для меня новая и знаний очень мало. Собственно мои заметки, которые сделал во время доклада:
    • посетители уходят чаще всего после 0-2с и 2-5с при посещении сайта
    • для описания продукта в интерент-магазине очень важны как подобраны расположения для картинки, заголовка и цена.
  7. Памирова Зоя,  онлайн-маркетолог. "Продвижение интернет-магазина". Один из наиболее интересных и полезных докладов. Очень понравился мне лично и остальным слушателям. Было много информации и ещё больше вопросов. Из минусов - мало времени на доклад и вопросы-ответы, из-за чего организаторам пришлось остановить непрекращающийся поток вопросов-ответов.
    Коротко об основных моментах "Продвижения интернет-магазина":
    • есть 3 шага: трафик, трафик + конверсия, трафик + конверсия + лояльность клиентов и узнаваемость;
    • наиболее зарекомендовавшая себя система раскрутки  (формулировка моя, т.ч. автор доклада может и другие люди не согласится с вышесказанным): SEO -> Контекстная реклама -> Прайс агрегаторы -> Почтовые рассылка -> Социальные сети -> Баннеры -> Offline реклама.
  8. "Организация системы приема платежей в работе интернет-проекта". Доклад был полностью посвящен рекламе money.ua и webmoney.com.ua. Для меня, IMHO, механизмы оплаты с помощью этих сервисов показались запутанными и непрозрачными из-за чего использовать их в будущем желания нет. 
  9. И последний по списку доклад на тему "Аудит юзабилити – обязательная часть комплексного продвижения" от Владимира Сахарова, руководителя отдела web-аналитики компании Seo-studio. Отличный доклад, хороший докладчик. Стоит отметить, что весь доклад занял всего-лишь 15 минут, а остальное было отведено секции вопросы-ответы. Были освещены некоторые аспекты юзабилити интернет-магазина на примере одного из украинских. Хочу еще сказать, что с Владимиром мы посже встретились на вокзале и уже после некоторого обдумывания услышанного на семинаре мы смогли задать и получить ответы на возникшие вопросы. В процессе разработки веб-сайтов Владимир выполняет именно ту роль, которая описана в книге Алана Купера "Психбольница в руках пациентов" и отвечает за проектирование интерфейсов пользователя (UI),  Из основных моментов доклада стоит отметить:
    • средняя конверсия интернет-магазинов в Украине находится на уровне 0.5-1%;
    • поиск по сайту оказывает очень большое влияниена на конверсию пользователей;
    • хороший сервис http://webvisor.ru/;
    • http://ux-ua.com/ - социальная сеть с уклонов на юзабилити сайтов;
    • "Thank you page" очень важна для интернет-магащинов;
    • и многое, многое - другое.

В целом, семинар понравился и о потраченном времени я не жалею. Единственное, что хочется отметить, это то, что мне так и не стало ясно на какую аудиторию рассчитавали организаторы. Посетители семинара были из разных целевых аудиторий: одним было интересно послушать доклады, на которых другие практически засыпали.


В прошлую пятницу прошла очередная встреча юзер-группы UNETA, На которой я делал доклад на тему "Введение в DLR" и затронул тему IronPython. Надеюсь, что вскоре найду время и напишу несколько более детельных постов на эту тему.

P.S. Для запуска проекта необходима Visual Studio 2010 и IronPython 2.6.1. Также использовалась библиотека json.codeplex.com/.

Introducing_to_DLR.ppt (352.00 kb)

IntroducingToDLR.rar (2.25 mb)


Разработчики JavaScript-фреймворка JQuery не перестают нас удивлять. После недавнего релиза JQuery 1.4.1 нам представили инструмент для unit-тестирования кода, написанного на JavaScript - QUnit

В данный момент поддерживаются такие функции как expect(), equals(), ok(), same(), log() и асинхронные тесты. Вместе с фреймворком распространяется css-файл, с помощью которого можно быстро и красиво выводить результаты тестов. Также разработчики активно используют его для тестирования самого JQuery, поэтому можно посмотреть уже готовые приверы от авторов фреймворка.

P.S. Что-то подсказывает мне что не загорами плагин для FireBug, по крайней мере, мне бы этого хотелось...


Почему-то, не смотря на свойственную для всех программистов лень (и не надо спорить, иначе бы мы не писаи кучу софта, который упрощает на жизнь и позволяет более легким способом добиться желаемого результата), все многие пытаются изобрести свой велосипед.

Я и сам придумал не один способ, как обмениваться данными между серверной и клиентской частью контрола. Но всегда догадывался, что есть более простой и "правильный" путь, особенно, когда смотрел на реализацию контролов из набора AjaxControlToolkit,

Реализация интерфейса IScriptControl, который состоит из 2-х методов, помагает реализовать нужную задачу в несколько строк кода (не считая, конечно-то ещё нескольких строчек на JavaScript).

 

 

  • В методе GetScriptDescriptors() мы создаём дескрипторы в которых говорим какие клиентские свойства должны быть у контрола.
  • Метод GetScriptReferences() возвращает список клиентских скриптов, которые нам нужны и будут автоматически загружены с помощью ScriptManager.
С серверной стороной мы практически закончили, осталось только добавить несколько строк в обработчики событий OnPreRender и Render:

 

С серверной стороной закончили. Теперь осталось совсем немного написать на JavaScript. Как всегда, большую часть за нас сделала Microsoft. Добавляем в проект js-файл типа AJAX ClientControl:

Для нас создастса уже готовый прототик контрола, где нам останется только объявить все наши свойства, getters & setters для них, события и методы. 

Не могу сказать что описаннный способ лучше(выше, быстрее) других, но он позволяет легко создавать серверные комнонеты с клиентской частью и избавить себя от многой рутинной работы. Также, значительно приятнее смотреть на более-менее стандартизовынный код, пусть даже этот стандарт создан разработчиками из Microsoft.

Хочу заметить, что всё описанное выше без каких-либо изминений можно применять только для WebControl. Если же нужно сделать UserControl, то в нём нужно поместить какой-либо контейнер (e.g. <div id="container" runat="server"></div>) и при создании дескрипторов указывать ID контейнера, иначе вы получите клиентскуб ошибку что не к сему привязать js объект.

Более подробно о каждом шаге можно почитать по ссылке http://en.csharp-online.net/Creating_Custom_ASP.NET_AJAX_Client_Controls—IScriptControl.GetScriptDescriptors_Method и в MSDN.

ScriptControlTest.zip (7.95 kb)


e0ne's comments

A Web Developer's Blog!