如何在viewstate中存储对象?

时间:2011-09-27 20:01:28

标签: 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();

然后尝试退回,

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

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

4 个答案:

答案 0 :(得分:6)

您正在存储字符串并期待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"];

答案 1 :(得分:6)

你有没有尝试过:

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

http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.itemid.itemid(EXCHG.80).aspx

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:0)

您无法将其存储在ViewState中。

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

ViewState使用LosFormatter类序列化。