1. Сервер должен работать только с одной главной страницей. Требование определяется логикой AJAX приложений, которые не перегружают страницу целиком, а лишь подгружают реально измененную часть. Кроме того, для корректной работы некоторых JavaScript компонентов технологии необходимо иметь единое хранилище глобальных переменных. Многие разработчики ASP.NET приложений самостоятельно отказываются от многостраничных сайтов для сохранения красивого адреса в браузере, перенося всю логику и визуализацию на динамически подгружаемые пользовательские контролы. При использовании технологии CallbackPage данное требование становится обязательным. В принципе, особых проблем это ограничение не вызывает, и уже после первого сайта одностраничная организация кажется вполне удобной. Название главной страницы, используемое по умолчанию - Default. Если по каким-либо причинам вы используете стартовую страницу сервера с другим названием, обязательно укажите ее в параметре DefaultPage. Предлагаем в качестве примера код основной части главной страницы сайта, который вы сейчас просматриваете:
<div id="MainDiv" runat=server> <CallbackPage:UserControlHolder ID="Default" CurrentControl="Home" runat=server> <CallbackPage:ControlAlias AliasName="Home" FullName="~/Controls/Welcome/Welcome.ascx" runat=server/> <CallbackPage:ControlAlias AliasName="Demo" FullName="~/Controls/Demo/Demo.ascx" runat=server/> <CallbackPage:ControlAlias AliasName="Help" FullName="~/Controls/Help/Help.ascx" runat=server/> <CallbackPage:ControlAlias AliasName="Download" FullName="~/Controls/Download/Download.ascx" runat=server /> <CallbackPage:ControlAlias AliasName="Register" FullName="~/Controls/Register/Register.ascx" runat=server /> </CallbackPage:UserControlHolder> </div>
При детальном изучении классов PathHolder и UserControlHolder вы познакомитесь с дополнительной информацией об организации сайта.
2. Все обращения к серверу должны осуществляться только с помощью JavaScript функции __doPostBack(). Если вы работаете с технологией ASP.NET больше двух недель, то уже, скорее всего, знаете, что это за функция и как она работает. По умолчанию любой контрол со свойством AutoPostBack вызывает ее для обращения к серверу, поэтому выполнение данного требования, скорее всего, не приведет к изменению привычных для вам методов работы. Единственное, что придется изменить - это установить свойство UseSubmitBehavior всех объектов класса Button в False (или, если вас волнует работа сайта при отключенном JavaScript, в значение, зависимое от свойства CallbackPage.IsJavaScriptEnabled: myButton.UseSubmitBehavior = CallbackPage.IsJavaScriptEnabled.HasValue ? !CallbackPage.IsJavaScriptEnabled.Value : false ).
3. Контейнеры должны быть серверными контролами, иметь блочный стиль отображения и не должны включать в себя аттрибуты форматирования. На сайте часто употребляется термин контейнер. Это ни что иное, как контрол, существующий как на клиентской части, так и на сервере, включающий в себя ту часть информации, которую необходимо обновить на сервере. Именно их идентификаторы и перечисляются в свойстве ControlsList объекта CallbackOption. Требование по стилю отображения является скорее рекомендацией. Нужно понимать, что подгруженная с сервера информация будет замещать существующую в данный момент и в случае испльзования inline - контейнера (например SPAN), возможны неприятные для пользователя мельтешения на экране. Мы обычно используем в качестве контейнеров элементы DIV. Отсутствие дополнительных аттрибутов форматирования (цвета, шрифта и т.д.) необходимо для оптимизации процесса обновления страницы и связано с внутренней реализацией технологии. Единственным допустимым атрибутом для контейнера является class, что дает вам возможность применять к нему любое CSS форматирование. Необходимость же установки аттрибута runat=server очевидна - страница должна иметь контейнер на стороне сервера, чтобы было что наполнять для отправки клиенту. На приведенном выше примере главной части страницы контейнер MainDiv служит для обновления основного содержимого сайта.
4. Необходимо указывать размеры используемых изображений в пикселях. То есть указание размера вида Width="20px" будет правильным, а Width=20 может вызвать в некоторых браузерах искажения картинок при их подзагрузке. Лучше всего в качестве серверного изображения использовать класс Image.
5. Все ссылки должны иметь знак "~" (тильда) в начале пути. ASP.NET программисты привыкли ставить тильду в свойствах серверных контролов, показывая, что маршрут следует начинать с корня сайта. При использовании нашей технологии любая ссылка должна начинаться с этого знака. Это относится не только к путям к изображениями, но и к любым ссылкам - например, к скриптам или таблицам стилей. Выполнение данного требования необходимо для корректного отображения сайта в браузерах с отключенным JavaScript, поисковых роботов и валидаторов.
<head runat=server> ... <link href="~/CallbackPage.css" type="text/css" rel="stylesheet"/> <link href"~/HelpPage.css" type="text/css" rel="stylesheet"/> <script type="text/javascript" src="~/Scripts/ModalControl.js"></script> <script type="text/javascript" src"~/Scripts/HelpScript.js"></script> ... </head>
6. Заголовок и тело главной страницы должны иметь аттрибут "runat=server". Это требование определяется необходимостью иметь соответствующие контролы на сервере для регистрации скриптов. Подробнее об этом вы можете узнать при описании класса CallbackPageScriptRegistrar
<html> <head runat=server> ... </head> <body runat=server> ... </body> </html>