Интересно, что при всей пропаганде этой технологии, мало кто знает, что кроме AJAX-надстройки, совместимой с концепцией контролов ASP.NET, в сборку System.Web.Extensions входят контролы и интерфейсы, которые вообще никакого отношения к AJAX не имеют (более того - могут работать без добавления на страницу ScriptManager). То же самое касается и клиентских скриптов - лишь небольшая их часть посвещена AJAX. Для чего же нужно всё остальное?
Одна из проблем, с которыми сталкивались практически все, кто писал клиентский фунционал к серверным контролам - это необходимость передавать в скриптовые функции ClientId контролов. Захардкодить их в скрипты нельзя, передавать в качестве глобальных переменных тоже. Самыми распространенными вариантами были:
- Передавать все ClientId в качестве аргументов функций. Неприятность здесь в том, что для некоторых функций число параметров может перевалить за полсотни. Работать с ними достаточно сложно, особенно в условиях отсутствия строгой типизации и интеллисенса в js (Orcas CTP - не в счет :)).
- Зачастую нежелание передавать огромное число параметров в качестве аргументов приводит к ещё более ужасному решению. Скрипт заносят в строковую переменную, а затем создают для каждого экземпляра контрола уникальную копию с правильными ClientId. То, что размер скрипта вырастает до невообразимых размеров, ещё пол беды. В таком скрипте совершенно невозможно разобраться. На свет появляется скрипт, весь состоящий из подобных кусков: [code language="JScript"]{22}.{13}=function(){{{3}.{17}.parent = {8}}}[/code]
Кроме того, оба эти подхода имеют массу скрытых сложностей, связанных с подпиской на события, передачей массивов и т.д.
Большинство двелоперов в итоге оказываются "погребены" под всем этим кодом, и внесение любых даже незначительных изменений проходит с большим трудом.
Те, кто посмекалистее, рано или поздно приходят к тому, что клиентский код должен быть своего рода "отражением" серверного, в том смысле что для каждого серверного контрола должен быть создан клиентский класс с соответствующими серверным полями. Тогда передавать ClientId нужно бутет только в одном месте - при инициализации объекта. Кроме того, процесс передачи можно автоматизировать в базовом контроле, и затем просто наследовать от него свои собственные.
К сожалению, здесь не всё так тривиально. Назвать яваскрипт ОО-языком можно лишь с большой натяжкой. Инкапсуляции нет, вместо наследования - копирование методов, строгой типизации нет, событийная модель отсутствует, и т.д. и т.п. Все это, безусловно, решаемо и преодолимо. Но решение не очевидно, да и кода написать подребуется не мало.
К нашему счастью, всё это уже сделано. Microsoft AJAX Library (так именуется клиентская часть Microsoft ASP.NET AJAX) привнесла в яваскрипт огромное количество расширений, в результате чего стало возможно создавать классы с нормальным наследованием, делать проверку типов, порождать полноценные события, регистрировать пространство имен, и, как результат, создавать своего рода клиентские контролы. А в System.Web.Extensions есть набор классов и интерфейсов, которые позволяют легко связывать эти клиетские контролы с серверными образами.
Каковы же плюсы и минусы? На мой взгляд, главный плюс состоит в том, что клиентский код начинает разделять идеологию серверного. Все имена типов и полей классов могут быть в точности повторены на клиенте, что значительно облегчает понимание кода и не требует постоянного переключения мышления с объектно-ориентрованного подхода на процедурный и обратно. Кроме того, теперь весь яваскриптовый код может быть сосредоточен исключительно в .js-файлах. И никаких RegisterScript. А минусы... лично я для себя минусов не нашел. Если кто найдет - сообщите.
Таким образом, если даже вы не собираетесь внедрять AJAX в своё приложение (а на это может быть масса весомых причин), но вам может потребоваться js-функциональность, рекомендую использовать Microsoft ASP.NET AJAX. Времени на освоение этой технологии уйдет немного, зато в последствии она сэкономит вам кучу нервов и времени.
P.S. На последок пара ссылок по теме:
http://ajax.asp.net/docs/tutorials/ExtenderControlTutorial1.aspx
http://ajax.asp.net/docs/tutorials/IScriptControlTutorial1.aspx