C# 如何在viewstate中存储对象?

C# 如何在viewstate中存储对象?,c#,asp.net,viewstate,C#,Asp.net,Viewstate,我正在使用EWS开发我的电子邮件客户端。我发现,如果我在viewstate中存储ItemId,将导致异常,如: 程序集“Microsoft.Exchange.WebServices,版本=14.0.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”中的类型“Microsoft.Exchange.WebServices.Data.ItemId”未标记为可序列化 如果我将ItemId存储为如下字符串: ViewState["itemId"] = id.ToStri

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

程序集“Microsoft.Exchange.WebServices,版本=14.0.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”中的类型“Microsoft.Exchange.WebServices.Data.ItemId”未标记为可序列化

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

ViewState["itemId"] = id.ToString();
然后试着回退

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

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

您正在存储字符串,并且需要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"];
您是否尝试过:

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

正如错误消息所示,除非对象标记为可序列化,否则无法将其存储在viewstate中

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


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

您不能将其存储在viewstate中

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

ViewState是用类序列化的。

OP特别指出“我发现如果我在ViewState中存储ItemId,将导致异常,并说”在程序集“Microsoft.Exchange.WebServices,Version=14.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”中键入“Microsoft.Exchange.WebServices.Data.ItemId”未标记为可序列化。“”