Как сохранить свойство <T> Списка в Пользовательском элементе управления ASP.NET?

Ваша проблема в том, что у Джексона есть стандарт для преобразования Карты в JSON. Ключи карты используются в качестве имен свойств в результатах JSON.

Map<String, Double> groceryPrices = new HashMap<>();
groceryPrices.put("apple", 0.25);
groceryPrices.put("orange", 0.30);

Это естественным образом переводится в объект JSON:

{
  "apple": 0.25,
  "orange": 0.30
}

Проблема в том, что вы используете сложный объект для представления ключа. Не существует простого метода для сериализации и десериализации вашего сложного объекта в / из строки.

Если вы не хотите писать собственную сериализацию, я предлагаю вам изменить структуру данных. Ваша текущая структура связывает модель с целыми числами. Вы можете сложить список целых чисел в сам объект Model:

Map<String, Model> models; // This could map modelId -> Model which now contains the integers
6
задан Larsenal 12 December 2008 в 18:33
поделиться

5 ответов

Черт! Не помещайте Список <> в ViewState! Это будет крупно!

Если Вы добавите Список <строка>, которая содержит два элемента - "abc" и "xyz" в ViewState, то это вырастет на 312 байтов.

Если вместо этого Вы добавите строку [], который содержит те же два элемента, то это только вырастет на 24 байта.

И это - просто списки строк! Можно поместить классы там, как Corey Downie предполагает, но ViewState распространится!

Для хранения этого разумным размером необходимо будет перейти к некоторому усилию преобразовать список объектов в массивы строк и назад снова.

Как альтернатива, рассмотрите помещение Ваших объектов в Сессию: тем путем Ваши объекты будут храниться на сервере, вместо того, чтобы быть сериализированными в ViewState и отправленными к браузеру и назад.

6
ответ дан 9 December 2019 в 22:41
поделиться

если Вы говорите о сохранении данных через обратные передачи той же страницы затем, можно вручную добавить объекты к ViewState и получению их На Загрузке.

1
ответ дан 9 December 2019 в 22:41
поделиться

Один способ преодолеть проблему размера с универсальным списком состоит в том, чтобы сохранить его в ViewState как его основной тип массива:

protected List<string> Items 
{ 
    get 
    { 
        if (ViewState["Items"] == null)
            ViewState["Items"] = new string[0];
        return new List<string>((string[])ViewState["Items"]);
    }
    set
    {
        ViewState["Items"] = value.ToArray();
    }
}
2
ответ дан 9 December 2019 в 22:41
поделиться

Я соглашаюсь, что существуют проблемы со Списком <> в состоянии отображения, но оно действительно работает. Обратите внимание, что нет никакого метода set на этом дизайном. Вам нужна ссылка на объект объекта списка, и Ваш получать метод может новый список при необходимости.

protected List<myClass> Items
{
    get
    {
        if (ViewState["myClass"] == null)
            ViewState["myClass"] = new List<myClass>();

        return (List<myClass>)ViewState["myClass"];
    }
}
1
ответ дан 9 December 2019 в 22:41
поделиться

Можно сохранить их в состоянии отображения средств управления

public List<myClass> Items{
    get { return this.ViewState["itemsKey"] }
    set { this.ViewState["itemsKey"]= value; }
}
1
ответ дан 9 December 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: