【问题标题】:How to store an object in the viewstate?如何在视图状态中存储对象?
【发布时间】:2011-09-27 20:01:27
【问题描述】:

我正在使用 EWS 开发我的电子邮件客户端。我发现如果我将 ItemId 存储在 viewstate 中会导致异常说:

在程序集“Microsoft.Exchange.WebServices, Version=14.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”中的类型“Microsoft.Exchange.WebServices.Data.ItemId”未标记为可序列化。

如果我将ItemId 存储为字符串,例如:

ViewState["itemId"] = id.ToString();

然后尝试回退,

ItemId id = (ItemId)ViewState["itemId"];

它说我无法从字符串转换为ItemId。有什么想法吗?

【问题讨论】:

    标签: c# asp.net viewstate


    【解决方案1】:

    您正在存储字符串并需要 ItemId。你应该存储为

    ItemId itemId = new ItemId();
    ViewState["itemId"] = itemId;
    

    但是,由于 ItemId 不可序列化,因此无法存储。要存储它,请从 ItemId 继承您的可序列化类并覆盖所有成员并将其存储在 ViewState 中

    [Serializable]
    public class MyItemId: ItemId {
     // override all properties 
    }
    

    这样存放

    MyItemId itemId = new MyItemId();
    ViewState["itemId"] = itemId;
    

    并检索

    MyItemId id=(MyItemId)ViewState["itemId"];
    

    【讨论】:

    • OP 专门说“我发现如果我将 ItemId 存储在 viewstate 中,它会导致异常说“Type 'Microsoft.Exchange.WebServices.Data.ItemId' in Assembly 'Microsoft.Exchange.WebServices, Version=14.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35' 未标记为可序列化。""
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      正如错误消息所暗示的,您不能将对象存储在视图状态中,除非它被标记为可序列化。

      查看文档here,似乎 ItemId 类有一个 UniqueId 属性,它是一个字符串,以及一个接受字符串 'uniqueId' 参数的构造函数。

      那么,能否将uniqueId存储在viewstate中,并使用构造函数重新生成对象?

      【讨论】:

        【解决方案4】:

        您不能将其存储在 ViewState 中。

        但是您可能会将其存储在 Session 中,因为它使用二进制格式化程序。

        ViewState 使用LosFormatter 类进行序列化。

        【讨论】:

          猜你喜欢
          • 2014-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-25
          相关资源
          最近更新 更多