使用SelectList的Value
和Text
属性是否有更好的方法,而不是我在后续视图中执行的操作?我觉得我正在做一些额外的工作。
注意:我了解使用Value
和Text
下拉列表的其他方法。此问题仅与使用SelectList
...
var customersList = _context.Customers.Select(c => new SelectListItem { Value = c.LastName, Text = c.FullName });
MyViewModel.lstCustomers = new SelectList(customersList , "Value", "Text");
...
return View(MyViewModel);
答案 0 :(得分:1)
用于生成HtmlHelper
元素(<select>
等)的@Html.DropDownListFor()
方法需要IEnumerable<SelectListItem>
作为参数之一,因此您的lstCustomers
也应该是IEnumerable<SelectListItem>
public IEnumerable<SelectListItem> lstCustomers { get; set; }
您的第一行代码
var customersList = _context.Customers.Select(c => new SelectListItem { Value = c.LastName, Text = c.FullName });
已经在生成,所以所需要的只是
MyViewModel.lstCustomers = customersList;
您使用new SelectList(customersList , "Value", "Text");
只是从第一个创建另一个相同的IEnumerable<SelectListItem>
,并且是不必要的额外开销。 (SelectList
是 IEnumerable<SelectListItem>
,它只是一个包装器,可以提供构造函数来生成集合。
如果您想使用SelectList
构造函数,请将代码更改为
var customersList = _context.Customers;
MyViewModel.lstCustomers = new SelectList(customersList , "LastName", "FullName");
两者都会生成相同的输出。方法之间的区别在于SelectList
构造函数使用反射来确定用于选项值和显示文本的属性,因此速度稍慢,并且它使用了“魔术字符串”。所以不是强类型。好处是它的冗长一点点。