序列化控制到viewstate

时间:2011-02-09 21:00:51

标签: asp.net custom-controls viewstate user-controls

我正在编写自定义用户控件。我觉得我这样做很难。

据我所知,为了在回发之间保留控件的状态,我必须将数据保存到ViewState。我已经在我的用户控件类的几个字段中完成了这个。

然而,这似乎很乏味。有没有办法让ASP.net在页面加载完成后立即将我的用户控件中的所有Seri​​alizable字段保存到ViewState?

1 个答案:

答案 0 :(得分:0)

我有一个解决方案,你仍然需要适应你的情况,因为这个示例(重新)存储控件的所有状态,也是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);
}