c# - DropDownListFor 正在更改我放在缓存上的 SelectedItem
问题描述
我在我的 asp.net MVC 应用程序中的 SelectListItems 上使用缓存来存储我在很多页面上使用的 SelectListItems。问题是,当我通过 DropDownListFor 使用它时,如果我向此 DropDownListFor 提供选定的值,则 SelectListItems 看起来会被更改......而且我想在没有“selected”属性的情况下将 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 的事实对 List 进行了更改(由内存中的缓存属性引用)?如果是,如何防止这种情况?使选择列表项只读?
谢谢大家
解决方案
源代码显示DropDownListFor
此扩展方法在内部设置了属性Selected
。
因为 aSelectListItem
是引用类型,所以此更改发生在缓存中的相应项上。
防止这种情况的一种方法是从该方法返回新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());
}
推荐阅读
- c# - 使用任务时由于返回值的 T-SQL 和 CLR 类型不匹配而失败
- maven - 如何为 xtend-maven-plugin 配置源兼容性级别?
- sql - Oracle 查询 - 选择日期和时间 - 重叠
- java - 为什么我无法使用 Spring Boot 在我的 Spring 上下文中获取我的 Bean 定义?
- java - 如何在 Hadoop/Spark 上的 spark 作业中使用 org.apache.httpcomponents?
- latex - wrapfig latex 相关查询
- ios - 仅在 iOS 13.1 和 13.2 中弹出视图背后的奇怪阴影
- c# - 如何在asp.net web api中每秒处理1000个并发用户请求
- vb.net - DatagridView 没有从 DataSource 获取数据
- java - 使用 URI 中的参数进行 PostMapping