10

这可能真的很简单......我正在尝试SelectList从当前的年份创建一个包含年份,直到 2008 年。情况总是如此。例如,在 2020 年,我的 SelectList 将包含 2020 - 2008 年的值。

我设置了这个循环,但我不确定最好的地方是什么

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

}

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

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

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

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

4

4 回答 4

21
var selectList = 
    new SelectList(Enumerable.Range(2008, (DateTime.Now.Year - 2008) + 1));
于 2012-12-19T18:54:41.653 回答
2

我不得不稍微改变接受的答案才能在旧版浏览器中工作。我最终得到一个选择列表,缺少这样的值

<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");
于 2013-11-20T19:35:21.170 回答
0

而不是将 a 添加SelectListItem到 a SelectList,只需将其添加到 a List<SelectListItem>。Razor 可以使用 aList<SelectListItem>作为源。

于 2012-12-19T18:59:15.367 回答
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
*/
于 2018-04-27T04:32:26.233 回答