C# DropDownListFor正在更改我放在缓存中的SelectedItem
我在asp.net MVC应用程序中的SelectListItems上使用缓存来存储我在许多页面上使用的SelectListItems。问题是,当我通过DropDownListFor使用它时,如果我向这个DropDownListFor提供一个选定的值,SelectListItems看起来会被更改。。。我想在缓存中保留th SELECTLIST项,而不保留selected属性 这是缓存: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
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());
}