【问题标题】:How to add Dictionary of class objects in to view state如何添加类对象字典以查看状态
【发布时间】:2013-07-30 19:50:30
【问题描述】:

我有一个[Serializable] class 和一些properties,methods and some web controls。 使用这个class,我变成了一个Dictionary<string,object> 变量。 这个Dictionary variable 包含我班的各种objects。 现在我需要将这个Dictionary variable 存储到view-state 中,这样我就可以在我的网络表单的每个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 中。

【问题讨论】:

    标签: asp.net object viewstate


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      正如错误提示的那样,您不能在 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;
      

      【讨论】:

      • 你的意思是这样说。实现这一点的唯一方法是我需要继承我在自定义类中使用的所有控制类,并使它们可序列化。
      • 不,这无济于事,因为子类(内置控件类)仍然无法序列化。我的建议是您构建一个类或结构来存储您的逻辑的所有相关数据以及您需要引用的任何控件 ID。我用一个简单的例子更新了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2012-11-21
      • 2014-12-16
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多