C# DropDownListFor正在更改我放在缓存中的SelectedItem

C# DropDownListFor正在更改我放在缓存中的SelectedItem,c#,asp.net,asp.net-mvc,caching,html.dropdownlistfor,C#,Asp.net,Asp.net Mvc,Caching,Html.dropdownlistfor,我在asp.net MVC应用程序中的SelectListItems上使用缓存来存储我在许多页面上使用的SelectListItems。问题是,当我通过DropDownListFor使用它时,如果我向这个DropDownListFor提供一个选定的值,SelectListItems看起来会被更改。。。我想在缓存中保留th SELECTLIST项,而不保留selected属性 这是缓存: public IEnumerable<SelectListItem> GetAllPersonne

我在asp.net MVC应用程序中的SelectListItems上使用缓存来存储我在许多页面上使用的SelectListItems。问题是,当我通过DropDownListFor使用它时,如果我向这个DropDownListFor提供一个选定的值,SelectListItems看起来会被更改。。。我想在缓存中保留th SELECTLIST项,而不保留selected属性

这是缓存:

public IEnumerable<SelectListItem> GetAllPersonnelCached()
{
CacheHelper.SaveToCache("mykey", valueToCache, 240); //HttpContext.Current.Cache.Add
CacheHelper.GetFromCache<IEnumerable<SelectListItem>>("mykey"); //HttpContext.Current.Cache["mykey"]
}
下面是我如何使用HTML部分的数据

@Html.DropDownListFor(x => x.personnelSelected, Model.personnelList, "PlaceHolder", new { data_placeholder = " " })
当我为一个网页运行这段代码时,它运行得很好。但是,当我调用GetAllPersonnelCached时,它会按预期为我提供所有项,但id为100的ListItem是selecteditem。为什么?我正在使用DropDownListFor对内存中缓存属性引用的列表进行更改?如果是,如何预防?是否将“选择”列表项设置为只读

多亏了所有的

,DropDownListFor的显示了此扩展方法在内部设置所选属性

因为SelectListItem是引用类型,所以此更改发生在缓存中的相应项上

防止这种情况的一种方法是从GetAllPersonnelCached方法返回新的SelectListItem对象,而不是原始的缓存对象

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);
}  

好的,我读到DropDownListFor没有使用选定的属性,但事实上是的。我应该读一下源代码。谢谢,我会将非selectListItem对象保存在缓存中*自豪地给予比利时配偶赏金;很高兴我能帮忙
@Html.DropDownListFor(x => x.personnelSelected, Model.personnelList, "PlaceHolder", new { data_placeholder = " " })
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);
}  
// 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());
}