0

我正在[Serializable] class和一些properties,methods and some web controls. 使用这个class我成为了一个Dictionary<string,object>变量。这Dictionary variable包含objects我的各种课程。现在我需要将其存储Dictionary variableview-state其中,以便我可以在我Dictionary variable的每个post-backWeb 表单上使用它。当我使用这行代码将我的存储Dictionary variableview-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 variableView-state.

4

2 回答 2

1

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

于 2013-07-30T11:22:34.053 回答
0

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

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

Web 控件将在视图状态中存储数据,而您无需执行任何操作,因此您的类可能只存储控件的 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;
于 2013-07-30T10:29:06.130 回答