如何在viewstate中存储对象?

Ste*_*ack 4 c# asp.net viewstate

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

然后试着回头

ItemId id = (ItemId)ViewState["itemId"];
Run Code Online (Sandbox Code Playgroud)

它说我无法从字符串转换为ItemId.任何的想法?

hun*_*ind 6

您正在存储字符串并期待ItemId.你应该存储为

ItemId itemId = new ItemId();
ViewState["itemId"] = itemId;
Run Code Online (Sandbox Code Playgroud)

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

[Serializable]
public class MyItemId: ItemId {
 // override all properties 
}
Run Code Online (Sandbox Code Playgroud)

像这样存储

MyItemId itemId = new MyItemId();
ViewState["itemId"] = itemId;
Run Code Online (Sandbox Code Playgroud)

并检索

MyItemId id=(MyItemId)ViewState["itemId"];
Run Code Online (Sandbox Code Playgroud)


Luk*_*vin 3

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

查看此处的文档,似乎 ItemId 类有一个 UniqueId 属性,它是一个字符串,以及一个采用字符串“uniqueId”参数的构造函数。

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