Сериализация управления для просмотра состояния - PullRequest
1 голос
/ 10 февраля 2011

Я пишу пользовательский элемент управления.Я чувствую, что делаю это нелегко.

Я понимаю, что для сохранения состояния моего элемента управления между обратными передачами я должен сохранить данные в ViewState.Я сделал это с несколькими полями в классе моего пользовательского элемента управления.

Однако, это кажется очень утомительным.Есть ли способ заставить ASP.net сохранить все поля Serializable в моем пользовательском элементе управления для ViewState сразу после завершения загрузки страницы?

1 Ответ

0 голосов
/ 10 февраля 2011

У меня есть решение, которое вам все еще нужно адаптировать к вашей ситуации, потому что в этом образце хранятся все состояния элемента управления, а также свойства, установленные средой выполнения asp.net. Помните, что Serializable не может быть установлен для свойства поля, только для класса / структуры. Однако вы можете создать свой собственный атрибут (ViewStateSerializable?), Который вы используете для оформления свойств, которые вы хотите сохранить во время обратных передач. Помните, что viewstate переходит к клиенту через провод, поэтому, если у вас его много, пользователи могут расстроиться ....

protected override object SaveViewState()
{
    Dictionary<string, object > dict = new Dictionary<string, object>();
    foreach (var prop in this.GetType().GetProperties())
    {
        // here we decide what to save
        if (prop.PropertyType.GetCustomAttributes(
              typeof(SerializableAttribute), false).Length>0)
        {
            dict.Add(prop.Name, prop.GetValue(this, new object[] {}));
        }
    }

    var ms = new MemoryStream();
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(ms, dict);

    return ms.ToArray();
}


protected override void LoadViewState(object savedState)
{
    BinaryFormatter bf = new BinaryFormatter();
    Dictionary<string, object> dict = 
        (Dictionary<string, object>) bf.Deserialize(
        new MemoryStream((byte[])savedState));

    foreach(var kv in dict)
    {
        this.GetType()
            .GetProperty(kv.Key)
            .SetValue(this, kv.Value, new object[] {});
    }
    base.LoadViewState(savedState);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...