我正在尝试完全概念化SelectList类在调用它时究竟在做什么。
请考虑以下代码:
public SelectList GetSelectList(string selectedItem)
{
return new SelectList(ItemList, "Key", "Value", "Group", selectedItem, null, null);
}
现在,我的更大智慧告诉我,每次调用我的方法GetSelectList()
时,它都会实例化SelectList class constructor
,然后循环遍历ItemList
。
我的智慧在这里是否正确?这可能看起来像一个愚蠢的问题,但我对确切的机制感兴趣,因为在我的页面GET请求中我不希望对没有selectedItem
的列表发生不必要的循环。我宁愿只生成特定SelectList
的缓存版本。
答案 0 :(得分:0)
调用new SelectList(..)
将迭代集合中的项目并生成IEnumerable<SelectListItem>
。您可以查看source code here(例如,查看GetListItemsWithValueField()
方法)。
使用SelectList()
构造函数是使用(比如说)
IEnumerable<SelectListItem> selectList = ItemList.Select(i => new SelectListItem()
{
Value = i.Key, // may need to add `.ToString()`
Text = i.Value,
...
});
但是它使用反射来获取由dataValueField
,dataValueField
等参数定义的属性,因此它的速度要慢一毫秒或者2(这实际上只取决于个人偏好以及您是否喜欢使用& #34;魔术字符串&#34;)
另请注意,如果绑定到model属性,将忽略设置selectedValue
参数。它是确定选择哪个选项的属性值,因此在缓存SelectList
方面,您可以忽略它。
但我建议您重新考虑缓存SelectList
。如果ItemList
的值很少更改,则ItemList
可能是缓存的良好候选者,并且添加或修改集合中的项的任何方法都可以调用方法来使缓存无效,但缓存如果基础集合发生变化,SelectList
可能会在确保其失效方面存在一些困难。创建SelectList
或IEnumerable<SelectListItem>
在应用程序的性能方面既快速且无关紧要。