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



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

ViewState[this.ClientID+"_CtrAdd"]=dictControl;

它抛出错误:

程序集"System.Web,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"中的类型"System.Web.UI.WebControls.TextBox"未标记为可序列化。

注:

My class objects contains some web controls.

有人能告诉我如何将这个Dictionary variable存储到View-state中吗。

您的异常非常清楚该做什么。您需要将数据存储在dictionary中,而不是控件中。控件引用了许多对象,所有这些对象都必须保存,这就是控件不可序列化的原因。您还希望保持ViewState尽可能小,大小将对您的性能产生重大影响。

正如错误所示,您无法在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;

最新更新