Итак, добавим на форму экземпляр AutoCompleteExtender.
<atlas:AutoCompleteExtender
ID="extSearchAutoCompleteExtender" runat="server">
<atlas:AutoCompleteProperties Enabled="true"
ServicePath="SearchService.asmx"
ServiceMethod="GetAutoCompleteList"
TargetControlID="tbSearch" />
</atlas:AutoCompleteExtender>
Как видите, все достаточно просто. Мы просто указали контролу путь к web-сервису, название метода и контрол, который будет расширен логикой автозаполнения.
Теперь мы можем посмотреть, что у нас получилось:
Глянем, как же выглядит результирующий html. Интересным для нас будет следующий код:
<script type="text/xml-script">
<page xmlns:script="http://schemas.microsoft.com/xml-script/2005">
<components>
<control id="tbSearch">
<behaviors>
<autoComplete serviceURL="SearchService.asmx" serviceMethod="GetAutoCompleteList" />
</behaviors>
</control>
</components>
</page></script>
Мы видим, что это тот же самый блок, сгенерированный ScriptManager-ом, но с заполненным тэгом <controls>. Таким образом, мы отметим еще одну важную архитектурную особенность Atlas: все Atlas контролы рендерятся в некий xml, за размещение которого отвечает ScriptManager.
Реализация формы: вывод результатов запроса.
Для вывода результатов запроса мы воспользуемся контролом, играющим важную роль в концепции Atlas. Речь идет об UpdatePanel. Этот контрол реализует функциональность по частичному рендерингу и постбэку формы. Используя его вы можете "перерисовывать" только часть формы, экономя на трафике и, что самое важное, сохраняя состояние контролов формы и значения javascript-переменных.
В нашем случае мы будем выводить результаты поиска, не перегружая всю форму целиком, а только ту ее часть, которая будет отображать выборку.
Для того, чтобы продемонстрировать, насколько это просто делается, сначала реализуем логику обработки поискового запроса в классическом postback-стиле, а затем воспользуемся UpdatePanel.
Будем выводить результаты поиска в обычный Repeater:
<asp:Repeater ID="lstResult" runat="server">
<ItemTemplate>
&
nbsp; <div>
&
nbsp; <a href='<%# Eval("URL") %>'>
<%#
Eval("Name")%>
&
nbsp; </a>
&
nbsp; </div>
</ItemTemplate>
</asp:Repeater>
В обычный серверный обработчик нажатия кнопки добавим следующий код:
protected void btnSearch_Click(object sender, EventArgs e)
{
lstResult.DataSource = GetSearchResult();
lstResult.DataBind();
}
Где GetSearchResult() – метод возвращающий результаты поиска.
Для того, чтобы убедиться, что форма перегрузилась целиком, добавим следующий код в класс формы:
public void Page_Load()
{
btnSearch.Attributes["onclick"] = "window.status='Поиск...'";
}
То есть, при нажатии на кнопку, в строку статуса браузера пропишется некое значение. Но так как страница целиком перегрузится, состояние строки статуса браузера утратиться. Запускаем и убеждаемся в этом:
Теперь изменим код нашей формы таким образом, чтобы Repeater, отображающий результаты поиска, оказался внутри UpdatePanel:
<atlas:UpdatePanel ID="pnlResults"
runat="server">
<ContentTemplate>
<asp:Repeater ID="lstResult"
runat="server">
…
</asp:Repeater>
</ContentTemplate>
</atlas:UpdatePanel>
Теперь укажем этому контролу, реакцией на какое событие на форме будет обновление панели. Для этого перейдем в режим дизайна формы и найдем свойство Triggers у UpdatePanel:
Нажав на кнопку редактирования свойства, мы попадаем в редактор триггеров:
Пока список пуст. Нажимаем "New Trigger":
В визарде создания триггера нам предлагается выбрать тип триггера: будет ли это реакция на конкретное событие контрола, или на изменение одного из его свойств. Нам нужен триггер, который бы реагировал на нажатие кнопки поиска. Для этого выбираем тип триггера "Trigger when a control raises an event", и выбираем во втором поле нашу кнопку и событие Click:
Завершаем редактирование и переходим в режим редактирования исходного кода формы. Мы увидим, что в тэга панели добавилась соответствующая секция:
<atlas:UpdatePanel ID="pnlResults"
runat="server">
…
<Triggers>
<atlas:ControlEventTrigger
ControlID="btnSearch" EventName="Click" />
</Triggers>
</atlas:UpdatePanel>
И, наконец, последнее действие. Мы должны установить свойство EnablePartialRendering у контрола ScriptManager в True:
<atlas:ScriptManager ID="scriptManager" runat="server"
EnablePartialRendering="True">
</atlas:ScriptManager>
Этим свойством вы укажете Atlas, что необходимо взять обработку всех постбэков на себя. Если вы забудете указать это свойство, то Atlas просто не будет знать, когда происходит постбэк и вся форма перегрузится целиком.
Все готово, можем запустить приложение и насладиться результатом:
Заключение
Стоит ли использовать Atlas сейчас в своих проектах? Каждый может решить это для себя сам. Важно только помнить, что каждый следующий релиз может поставлять не только исправления старых ошибок, но и радикально измененный дизайн библиотеки. Кроме того, текущая версия, как показывает опыт, устойчиво ведет себя только в основных вариантах использования. Если вы захотите большей гибкости, то готовьтесь столкнуться с кучей проблем.
Нужно отметить, то разработка Atlas идет с активным параллельным внедрением. Вы можете посмотреть, как Atlas используется на сайтах http://www.live.com/, http://www.start.com/, http://beta.msn.com/, http://microsoftgadgets.com/. Можно предположить, что релиз Atlas будет тогда же, когда будет релиз этих сайтов. Так же можно предположить, что Atlas вполне может быть встроен в ASP.NET версии, которая будет поставляться с новейшей версией .NET, который ожидается после релиза Vista. Ну а все эти взаимосвязи и проекты наводят на мысли, что Atlas является частью большого плана Microsoft по активному продвижению концепции "Web 2.0".
Что ж, нам остается наедятся, что результат этих трудов будет соответствовать заявленным планам.
P.S. В коде тестового сайта в реализации метода GetAutoCompleteList() использовался код из примера в одной из лабораторных работ по Atlas, которые вы можете найти на сайте проекта.