2015-07-10 2 views
1

У меня есть приложение 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 поиск оказался таким многообещающим, но я все еще не мог получить обходного пути.

ответ

1

Вы можете просто использовать Json.Newtonsoft для преобразования объекта в строку. Затем используйте эту строку в Viewstate.

Что-то вроде этого должно работать.

Item item = new Item(); 
    item.ID = 1; 
    item.Name = "John"; 
    ViewState["MyKey"] = JsonConvert.SerializeObject(item); 
Смежные вопросы