SelectList多年

时间:2012-12-19 18:51:22

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

这可能非常简单......我正在尝试创建一个SelectList,其中包含当前的年份,直到2008年。这种情况总是如此。例如,在2020年,我的SelectList将包含2020年至2008年的值。

我设置了这个循环,但我不确定最适合这个的地方是

for (int i = currentYear; i != 2009; --i)
{

}

是否可以为每次迭代创建一个SelectListItem并将其“添加”到SelectList

我不认为上面的陈述是可能的,所以我的下一个想法是创建一个年份列表,然后使用LINQ来创建它。

var selectList = ListOfYears.Select(new SelectListItem
{
    Value =
    Text = 
});

但是我不完全确定如何从列表中获取值。 感谢

4 个答案:

答案 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
*/