这可能非常简单......我正在尝试创建一个SelectList
,其中包含当前的年份,直到2008年。这种情况总是如此。例如,在2020年,我的SelectList将包含2020年至2008年的值。
我设置了这个循环,但我不确定最适合这个的地方是
for (int i = currentYear; i != 2009; --i)
{
}
是否可以为每次迭代创建一个SelectListItem
并将其“添加”到SelectList
?
我不认为上面的陈述是可能的,所以我的下一个想法是创建一个年份列表,然后使用LINQ来创建它。
var selectList = ListOfYears.Select(new SelectListItem
{
Value =
Text =
});
但是我不完全确定如何从列表中获取值。 感谢
答案 0 :(得分:16)
var selectList =
new SelectList(Enumerable.Range(2008, (DateTime.Now.Year - 2008) + 1));
答案 1 :(得分:1)
我必须稍微更改已接受的答案才能在旧浏览器中使用。我最终得到了一个缺少像这样的值的选择列表
<option value="">1996</option><option value="">1997</option>
我必须将上面的代码改为
var yr = Enumerable.Range(1996, (DateTime.Now.Year - 1995)).Reverse().Select(x => new SelectListItem { Value = x.ToString(), Text = x.ToString() });
return new SelectList(yr.ToList(), "Value", "Text");
答案 2 :(得分:0)
不要将SelectListItem
添加到SelectList
,只需将其添加到List<SelectListItem>
即可。剃刀可以使用List<SelectListItem>
作为来源。
答案 3 :(得分:0)
我创建了一个函数来帮助我解决这个问题。它将根据您提供的值自动反转。
检查出来,让我知道你的想法,以及你是否可以改进它:
public static IEnumerable<SelectListItem> Years(int from, int to, int? value = default(int?)) {
var reverse = from > to;
var min = reverse ? to : from;
var max = reverse ? from : to;
var years = Enumerable.Range(min, max - min);
if (reverse) {
years = years.Reverse();
}
return years.Select(year => new SelectListItem {
Value = year.ToString(),
Text = year.ToString(),
Selected = value.Equals(year),
});
}
使用:强>
Years(DateTime.Now.Year, DateTime.Now.Year + 4)
/* result: (currently 2018)
2018
2019
2020
2021
*/
Years(DateTime.Now.Year + 4, DateTime.Now.Year, 2019)
/* result: (currently 2018)
2021
2020
2019 (selected)
2018
*/