我正在编写自定义用户控件。我觉得我这样做很难。
据我所知,为了在回发之间保留控件的状态,我必须将数据保存到ViewState。我已经在我的用户控件类的几个字段中完成了这个。
然而,这似乎很乏味。有没有办法让ASP.net在页面加载完成后立即将我的用户控件中的所有Serializable字段保存到ViewState?
答案 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);
}