如何在ViewState中托管可移植类库类实例

时间:2015-07-10 23:51:30

标签: c# asp.net serialization webforms viewstate

我有一个带有两个项目的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搜索看起来很有前途,但我仍然无法获得解决方法。

1 个答案:

答案 0 :(得分:1)

您可以使用Json.Newtonsoft将对象转换为字符串。然后在Viewstate中使用该字符串。

这样的事情应该有效。

 Item item = new Item();
    item.ID = 1;
    item.Name = "John";
    ViewState["MyKey"] = JsonConvert.SerializeObject(item);