如何将类对象的Dictionary添加到视图状态

时间:2013-07-30 10:20:39

标签: asp.net object viewstate

我的[Serializable] class有一些properties,methods and some web controls。 使用此class我创建了一个Dictionary<string,object>变量。 此Dictionary variable包含我班级的各种objects。 现在我需要将此Dictionary variable存储到view-state中,以便我可以在我的网络表单的每个Dictionary variable上使用此post-back。 当我使用这行代码将Dictionary variable存储到view-state

  

ViewState [this.ClientID +“_ ArcAdd”] = dictControl;

它抛出错误:

  

在Assembly'System.Web中输入'System.Web.UI.WebControls.TextBox',Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'未标记为可序列化。

注意:

My class objects contains some web controls.

任何人都可以告诉我如何将此Dictionary variable存储到View-state

2 个答案:

答案 0 :(得分:1)

您的例外情况很清楚,该怎么办。您需要将数据存储在dictonary中,而不是控件中。控制对许多对象的引用,所有这些对象都必须保存,这就是控件不可序列化的原因。您还希望保持ViewState尽可能小,大小会对您的性能产​​生重大影响。

答案 1 :(得分:0)

如错误所示,您无法在ViewState中存储某些类,即那些未标记为可序列化的类。这是因为ViewState作为BASE64编码的字符串存储在页面的隐藏字段中,因此您尝试在ViewState中存储的任何类都必须是可序列化的。

您可以更成功地构建一个单独的类,该类只存储您需要存储的数据,以便在下一次回发中使用它。

Web控件将数据存储在视图状态而无需您执行任何操作,因此您的类可能只存储控件的ID,然后您可以使用该ID来引用控件。

例如:

[Serializable]
class MyCustomData
{
    public string TextBoxID1 { get; set; }
    public int MyCounter { get; set;}
    public decimal MyTotal { get; set; }
}

var data = new MyCustomData { TextBoxID1 = txtMyTextBox.ID, MyCounter = anInt, MyTotal = aDecimal };
ViewState[this.ClientID + "_Data"] = data;