У меня есть приложение ASP.NET для веб-форм с двумя проектами: Основной веб-проект и portable class library project. У меня есть следующий код:Как разместить экземпляр класса библиотеки класса Class в ViewState
В портативном проекте у меня есть 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;
}
}
Очевидно, что это вызывает ошибку:
Type 'PortableProject.Item' in Assembly 'PortableProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable
Хотя я знаю о проблеме и d ожидаемое решение, я не могу его реализовать. Решение заключается в предоставлении атрибута [Serializable]
классу Item
. Однако это невозможно, потому что в переносимой библиотеке классов нет System.SerializableAttribute
. Я знаю this Аналогичный вопрос. Тем не менее, украшение класса атрибутом [DataContract]
и членами с [DataMember]
не решило проблему (та же ошибка сохранялась). По-видимому, состояние представления сериализует объект определенным образом, что требует функциональности, которую предоставляет атрибут [Serializable]
. Итак, как поместить экземпляр Item
в состояние просмотра без предыдущей ошибки?
EDIT
Я все еще ищет решение. Очевидно, что мой портативный проект будет потребляться межплатформенными средами, поэтому я должен держать его в портативной библиотеке классов. Более того, я хочу использовать классы в этой переносимой библиотеке классов на моих страницах веб-форм (а именно объект ViewState).
This поиск оказался таким многообещающим, но я все еще не мог получить обходного пути.