Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Сохранение объектов в состоянии вида






Как уже говорилось, состояние вида позволяет хранить, кроме простых типов, также и объекты. Для того чтобы элемент мог быть сохранен в состояние вида, он должен быть сперва преобразован в последовательность байтов. Такой процесс называется сериализацией. При создании нового класса по умолчанию его объекты не поддаются сериализации. При попытке поместить их в состояние вида появляется сообщение об ошибке. Для того чтобы создать объект, поддающийся сериализации, необходимо перед объявлением класса данного объекта разместить атрибут Serializable. Пример создания и сохранения класса в состоянии вида приведен ниже.

Здесь создается класс User, который может быть подвергнут сериализации, и создается объект этого класса, который затем сохраняется в состояние вида. Полный исходный текст приложения приведен ниже.

public partial class _Default: System.Web.UI.Page{ [Serializable] public class User { public string FirstName; public string LastName; public User(string firstName, string lastName) { FirstName = firstName; LastName = lastName; } } protected void Button1_Click(object sender, EventArgs e) { lbl_Result.Text = " Здравствуйте, " +tb_FirstName.Text+" " + tb_LastName.Text+"! Добро пожаловать в приложение ASP.NET"; lbl_Result.ForeColor = Color.Red; //Сохраняем объект в ViewState User user = new User(tb_FirstName.Text, tb_LastName.Text); ViewState[" CurrentUser" ] = user; tb_FirstName.Text = " "; tb_LastName.Text = " "; } protected void btn_RestoreTextBox_Click(object sender, EventArgs e) { //Восстанавливаем значение объекта User User user; if (ViewState[" CurrentUser" ]! = null) { user = (User)ViewState[" CurrentUser" ]; tb_LastName.Text = user.LastName; tb_FirstName.Text = user.FirstName; } } protected void Page_Load(object sender, EventArgs e) { }}

Использование состояния вида является хорошим вариантом сохранения значений переменных и полей форм между вызовами, т. к. не предполагает задействование ресурсов памяти сервера. Тем не менее существуют несколько отрицательных сторон применения ViewState.



1. Данные ViewState сохраняются в скрытых полях страницы и передаются на сторону клиента. В этом можно убедиться, просмотрев исходный код такой страницы. Конечно, эти данные не хранятся в открытом виде, они представлены в формате Base64, однако их легко можно преобразовать в массив байт, представляющих символы ASCII. Для этого достаточно использовать функцию FromBase64String как показано в следующем примере:

Byte[] stringBytes=Convert.FromBase64String(ViewStateString); String decodedString=System.Text.Encoding.ASCII.GetString(stringBytes);

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

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

2. ViewState не позволяет сохранять информацию, которая будет использоваться несколькими страницами. В этом случае лучше воспользоваться состоянием сеанса, наборами cookie либо строкой запроса.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.