我的[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
。
答案 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;