Что передается клиенту?
Сценарии ASP.NET программируются в обычном стиле VB.NET, однако в зависимости от типа клиентского браузера генерируется разный код HTML. Например, если клиент работает в последней версии Internet Explorer, в сгенерированном коде используются конструкции DHTML, а интервальная проверка осуществляется на стороне клиента. Но если в качестве браузера используется сотовый телефон с поддержкой WAP (Wireless Application Protocol), будет сгенерирован код WML (версия HTML для этой платформы), а все необходимые проверки будут выполняться сервером. И все это происходит автоматически, совершенно не требуя особых действий со стороны программиста! [Если, конечно, вы не займетесь разработкой нестандартных элементов для форм Web – в этом случае вам придется изрядно потрудиться. Элементы форм Web должны знать, какой код следует генерировать для каждой конкретной платформы.]
Ниже приведен код предыдущего примера, сгенерированный для клиентского браузера Internet Explorer, работающего в Windows XP.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAO> <title></title> <meta name="GENERATOR"content="Microsoft Visual Studio .NET 7.0"> <meta name="CODE_LANGUAGE"content="Visual Basic 7.0"> <meta name="vs_defaultClientScnpt"content="JavaScnpt"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intel1isense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form name="Forml" method="post" action="WebForml.aspx" id="Forml"> <input type="hidden" name="_VIEWSTATE" value="dDwxMDA3MzE2MzEy0zs+"/> <input type="subm1t" name="Buttonl" value="Click me!" id="Buttonl" style="height:67px;width:123px;Z-INDEX: 101: LEFT:311px: POSITION:absolute;TOP:212px"/> <span id="Labell"style="height:132px:width:631px:Z-INDEX:102: LEFT:15px;POSITION:absolute:TOP:40px"></span> </form> </body> </HTML>
Из выделенного фрагмента видно, что в сгенерированный для клиентской стороны HTML-код включена форма HTML с атрибутом post и скрытым полем _VIEWSTATE. Эти строки позволяют ASP.NET сохранять информацию состояния, не требуя специальных действий со стороны клиента. Скрытое поле _VIEWSTATE содержит зашифрованные данные, по которым ASP.NET может восстановить страницу и ее состояние. Механизм шифрования представляет собой особую разновидность сериализации; чтобы отключить сохранение состояния, задайте свойству Enable-ViewState значение False.
Чтобы лучше понять, как происходит сохранение состояния, нажмите кнопку и снова просмотрите исходный текст. На этот раз ключевые строки HTML-кода будут выглядеть примерно так:
<form name="Forml" method="post" action="WebForml.aspx" id="Forml"> <input type="hidden" name="_VIEWSTATE" value="dDwxMDA3MzE2MzEy03Q802w8aTwxPjs+ 02w8dDw7bDxpPDM+Oz47bDxOPHA, 8cDxsPEZvbnRfU216ZTtUZXh0018hUOI7PjtsPFN5 c3RlbS5XZWIuVUkuV2Vi029udHJvbH MuRm9udFVuaXQsIFN5c3RlbS5XZWIsIFZlcnNpb 249MS4wLjIOMTEuMCwgQ3VsdHVyZT luZXVOcmFsLCBQdWJsaWNLZXlUb2tlbjliMDNmN WY3ZjExZDUwYTNhPFgtT6FyZ2U+0 ldlbGNvbWUgdG8gQVNQLk5FVCBAOC8xOS8yMDAx IDEyOjM20jAwIFBN02k8MTQwOT 47Pj47Pjs7Pjs+Pjs+Pjs+"/>
Хотя базовый файл .aspx, указанный в атрибуте тега <form>, остался прежним, скрытая переменная _VIEWSTATE изменилась весьма основательно. Фактически в этом поле сохранено полное состояние элементов HTML и данных формы. Одно из преимуществ этого подхода заключается в том, что программист избавляется от хлопот с сохранением состояния. Он просто задает свойству EnableViewState значение True и переходит к программированию логики страницы. С другой стороны, с каждой страницей приходится пересылать дополнительные данные. В большинстве случаев их объем относительно невелик, поэтому преимущества компенсируют недостатки.
Примечание
Элементы ввода (тег <input>) на стороне клиента всегда запоминают свое состояние даже после пересылки данных на сервер и обратно. ASP.NET не позволяет отключать автоматическое сохранение состояния для элементов ввода.
Наконец, у каждой страницы .aspx имеется свойство Session, возвращающее объект с информацией о текущей странице. Объект Session можно рассматривать как своего рода "cynepcookie" с возможностью сохранения данных по ключу (как в хэш-таблицах). Пример:
Session("user name") = TextBox1.Text
Содержимое текстового поля TextBoxl сохраняется в объекте Session, а при обращениях к – нему используется строка "user name".
Примечание
Нехватка места не позволяет развивать эту тему, однако мы хотим обратить внимание читателя на одно обстоятельство. В особо сложных ситуациях, когда сохранение всех данных в объекте Session, находящемся в памяти сервера, нежелательно, информация сохраняется в базе данных SQL Server. Более того, если сайт обслуживается web-комплексом, вы даже можете указать, на каком сервере должна храниться эта информация! Эти две особенности значительно улучшают масштабируемость приложений ASP.NET.