我有一个带有两个项目的ASP.NET Web表单应用程序:主Web项目和portable class library project。我有以下代码:
在便携式项目中,我有一个Item
类:
public class Item
{
public int ID { get; set; }
public string Name { get; set; }
}
在Default.aspx.cs页面中,我有以下演示代码:
protected void Page_Load(object sender, EventArgs e)
{
Item item = new Item();
item.ID = 1;
item.Name = "John";
ViewState["MyKey"] = item;
}
protected void Button1_Click(object sender, EventArgs e)
// Obviously I have a button named "Button1" on the page.
{
if (ViewState["MyKey"] != null)
{
Item item = (Item)ViewState["MyKey"];
Button1.Text = item.ID + " " + item.Name;
}
}
显然是造成错误:
输入' PortableProject.Item'在Assembly' PortableProject中, Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'没有标记 可序列化
虽然我意识到问题和预期的解决方案,但我无法实现它。解决方案是向[Serializable]
类提供属性Item
。但是,这是不可能的,因为可移植类库没有System.SerializableAttribute
。我很清楚this类似的问题。但是,使用[DataContract]
属性和[DataMember]
成员来装饰类并没有解决问题(同样的错误仍然显示)。显然,视图状态以特定方式序列化对象,该方式需要[Serializable]
属性提供的功能。那么,如何在没有前面错误的情况下将Item
的实例放在视图状态中?
修改
我还在寻找解决方案。显然,我的便携式项目将被跨平台环境所使用,这就是为什么我必须保留一个便携式类库。此外,我希望在我的Web表单页面(即ViewState对象)中使用该可移植类库中的类。
This搜索看起来很有前途,但我仍然无法获得解决方法。
答案 0 :(得分:1)
您可以使用Json.Newtonsoft将对象转换为字符串。然后在Viewstate中使用该字符串。
这样的事情应该有效。
Item item = new Item();
item.ID = 1;
item.Name = "John";
ViewState["MyKey"] = JsonConvert.SerializeObject(item);