2011-02-09 10 views
1

私はカスタムユーザーコントロールを作成しています。私はこれをやっているような気がする。コントロールをビューステートにシリアライズ

私のコントロールの状態をポストバックの間保存するためには、データをViewStateに保存する必要があることを理解しています。私は、私のユーザーコントロールのクラスのいくつかのフィールドでこれを行ってきました。

しかし、非常に面倒なようです。 ASP.netで、ページの読み込みが完了した時点で、すべてのSerializableフィールドをViewStateに一度に保存する方法はありますか?

答えて

0

このサンプルでは、​​コントロールのすべての状態、asp.netランタイムによって設定されたプロパティも保存されるため、状況に合わせて調整する必要があるソリューションがあります。 Serializableは、フィールドのプロパティでは設定できません。クラス/構造体のみです。ただし、ポストバック時に保持するプロパティを装飾するために使用する独自の属性(ViewStateSerializable?)を作成することはできます。ビューステートがクライアントに接続されていることを覚えておいてください。多くの場合、ユーザーは動揺するかもしれません....

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); 
} 
関連する問題