DropDownListFor 正在更改我放在缓存中的 SelectedItem
DropDownListFor is changing SelectedItem I've put on Cache
我在我的 asp.net MVC 应用程序中使用 SelectListItems 缓存来存储我在很多页面上使用的 SelectListItems。问题是,当我通过 DropDownListFor 使用它时,如果我为此 DropDownListFor 提供一个 selected 值,则 SelectListItems 看起来会被更改......我想在没有 [=28 的情况下将 SelectListItems 保留在缓存中=] 属性!
这是缓存:
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 时,它按预期提供了所有项目,但 ID 为 100 的 ListItem 是 "selecteditem"。为什么?我正在使用 DropDownListFor 的事实对列表进行了更改(由内存中的缓存 属性 引用)?如果是,如何防止这种情况?将 select 列表项设为只读?
感谢大家
DropDownListFor
的source code说明这个扩展方法内部设置了Selected
属性.
因为SelectListItem
是一个引用类型,这个变化发生在缓存中的相应项上。
防止这种情况的一种方法是 return 来自 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);
}
您可能会考虑不缓存 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());
}
我在我的 asp.net MVC 应用程序中使用 SelectListItems 缓存来存储我在很多页面上使用的 SelectListItems。问题是,当我通过 DropDownListFor 使用它时,如果我为此 DropDownListFor 提供一个 selected 值,则 SelectListItems 看起来会被更改......我想在没有 [=28 的情况下将 SelectListItems 保留在缓存中=] 属性!
这是缓存:
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 时,它按预期提供了所有项目,但 ID 为 100 的 ListItem 是 "selecteditem"。为什么?我正在使用 DropDownListFor 的事实对列表进行了更改(由内存中的缓存 属性 引用)?如果是,如何防止这种情况?将 select 列表项设为只读?
感谢大家
DropDownListFor
的source code说明这个扩展方法内部设置了Selected
属性.
因为SelectListItem
是一个引用类型,这个变化发生在缓存中的相应项上。
防止这种情况的一种方法是 return 来自 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);
}
您可能会考虑不缓存 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());
}