2012-12-19 11 views
7

To jest prawdopodobnie naprawdę proste ... Próbuję utworzyć SelectList, zawierający lata od bieżącego, do 2008 roku. Tak będzie zawsze. Na przykład, w 2020 roku, mój SelectList będzie zawierać wartości od 2020 - 2008.SelectList dla lat

I utworzonej tej pętli, ale nie jestem pewien, co najlepsze miejsce, aby iść z tym jest

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

} 

Czy jest możliwe utworzenie pojedynczego SelectListItem i "dodanie" go do SelectList dla każdej iteracji?

Nie sądzę, że moje powyższe zdanie jest możliwe, więc moją następną myślą było stworzenie listy lat, a następnie użycie LINQ do jej stworzenia.

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

Ale nie jestem całkowicie pewien, jak uzyskać wartość z listy. Dzięki

Odpowiedz

15
var selectList = 
    new SelectList(Enumerable.Range(2008, (DateTime.Now.Year - 2008) + 1)); 
+0

ostatecznie, gdy ten staje się listy rozwijanej, przewiduję, że będzie wymienione w kolejności 2008 ... 2012. Czy istnieje sposób, aby to odwrócić? "Zakres" nie wydawał się podobać wartościom ujemnym. Ponadto szybkie uruchomienie debuggera pokazuje, że Twój kod pochodzi z okresu 2008-2011. Łatwe rozwiązanie – Jeff

+1

Wystarczy rzucić .Reverse() po Enumerable.Range. –

+1

Dziękuję. To działa 'var selectList = new SelectList (Enumerable.Range (2008, DateTime.Now.Year - 2007) .Reverse());' – Jeff

0

Zamiast dodać SelectListItem Do SelectList, wystarczy dodać go do List<SelectListItem>. Razor może używać źródła List<SelectListItem>.

1

Musiałem nieznacznie zmienić zaakceptowaną odpowiedź, aby działała w starszych przeglądarkach. Skończyło się na liście select brakującej wartości jak ten

<option value="">1996</option><option value="">1997</option> 

musiałem zmienić powyższy kod do tego

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");