DropDownList для изменения SelectedItem я положил на кэш - PullRequest
0 голосов
/ 29 апреля 2019

Я использую кеш для SelectListItems в своем приложении asp.net MVC для хранения SelectListItems, который я использую на многих страницах.Проблема в том, что когда я использую его через DropDownListFor, если я предоставляю выбранное значение этому DropDownListFor, SelectListItems выглядит измененным ... И я хочу сохранить th SelectListItems в кеше без свойства selected,

Вот кеш:

public IEnumerable<SelectListItem> GetAllPersonnelCached()
{
CacheHelper.SaveToCache("mykey", valueToCache, 240); //HttpContext.Current.Cache.Add
CacheHelper.GetFromCache<IEnumerable<SelectListItem>>("mykey"); //HttpContext.Current.Cache["mykey"]
}

Это свойства модели, которую я использую

        public int? personnelSelected{ get; set; }
        public IEnumerable<SelectListItem> personnelList{ get; set; }

И как я ее заполняю:

responsibleSelected = 100;
personnelList = GetAllPersonnelCached();

А вот как я использую данные в части HTML

@Html.DropDownListFor(x => x.personnelSelected, Model.personnelList, "PlaceHolder", new { data_placeholder = " " })

Когда я запускаю этот код для веб-страницы, он работает хорошо.НО тогда, когда я вызываю GetAllPersonnelCached, он дает мне все элементы, как и ожидалось, но ListItem с идентификатором 100 - "selecteditem".ЗАЧЕМ?Тот факт, что я использую DropDownListFor вносит изменения в список (на который ссылается свойство кэша в памяти)?Если да, как это предотвратить?Сделать выбранный элемент списка доступным только для чтения?

Спасибо всем

1 Ответ

1 голос
/ 02 мая 2019

Исходный код DropDownListFor показывает, что этот метод расширения внутренне устанавливает свойство Selected.

Поскольку SelectListItem является ссылочным типом, это изменение происходит всоответствующий элемент в кэше.

Один из способов предотвратить это - возвращать новые SelectListItem объекты из метода GetAllPersonnelCached вместо исходных кэшированных.

public IEnumerable<SelectListItem> GetAllPersonnelCached()
{
    CacheHelper.SaveToCache("mykey", valueToCache, 240); 
    var cachedItems = CacheHelper.GetFromCache<IEnumerable<SelectListItem>>("mykey");

    return cachedItems.Select(o => new SelectListItem(o.Text, o.Value);
}  

Возможно, вы решите не кэшировать SelectListItem экземпляров, а вместо этого объекты персональных данных, которые вы преобразуете в SelectListItem экземпляров при извлечении.

// Assume your PersonnelData looks like below.    
class PersonnelData
{
    int Id { get; set; }
    string Name { get; set; }
}

public IEnumerable<SelectListItem> GetAllPersonnelCached()
{
    // valueToCache is a list of PersonnelData objects.
    CacheHelper.SaveToCache("mykey", valueToCache, 240);
    var cachedPersonnelData = CacheHelper.GetFromCache<IEnumerable<PersonnelData>>("mykey");

    return cachedPersonnelData.Select(o => new SelectListItem(o.Name, o.Id.ToString());
}
...