MVC 4 SelectList Class,它做什么exaclty?

时间:2015-05-12 23:48:02

标签: c# asp.net-mvc-4

我正在尝试完全概念化SelectList类在调用它时究竟在做什么。

请考虑以下代码:

public SelectList GetSelectList(string selectedItem)
{
    return new SelectList(ItemList, "Key", "Value", "Group", selectedItem, null, null);
}

现在,我的更大智慧告诉我,每次调用我的方法GetSelectList()时,它都会实例化SelectList class constructor,然后循环遍历ItemList

我的智慧在这里是否正确?这可能看起来像一个愚蠢的问题,但我对确切的机制感兴趣,因为在我的页面GET请求中我不希望对没有selectedItem的列表发生不必要的循环。我宁愿只生成特定SelectList的缓存版本。

1 个答案:

答案 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,
  ...
});

但是它使用反射来获取由dataValueFielddataValueField等参数定义的属性,因此它的速度要慢一毫秒或者2(这实际上只取决于个人偏好以及您是否喜欢使用& #34;魔术字符串&#34;)

另请注意,如果绑定到model属性,将忽略设置selectedValue参数。它是确定选择哪个选项的属性值,因此在缓存SelectList方面,您可以忽略它。

但我建议您重新考虑缓存SelectList。如果ItemList的值很少更改,则ItemList可能是缓存的良好候选者,并且添加或修改集合中的项的任何方法都可以调用方法来使缓存无效,但缓存如果基础集合发生变化,SelectList可能会在确保其失效方面存在一些困难。创建SelectListIEnumerable<SelectListItem>在应用程序的性能方面既快速且无关紧要。