2010-05-26 14 views
29

Questo metodo sembra stupido e un po 'pesante; c'è un modo più ottimale di creare la stessa cosa (la sua per un MVC View discesa)Creazione di un elenco a discesa mese in C# ASP.NET MVC

private List<KeyValuePair<int, string>> getMonthListDD 
{ 
    get 
    { 
     var dDur = new List<KeyValuePair<int, string>>(); 
     dDur.Add(new KeyValuePair<int, string>(1, "January")); 
     dDur.Add(new KeyValuePair<int, string>(2, "Febuary")); 
     dDur.Add(new KeyValuePair<int, string>(3, "March")); 
     dDur.Add(new KeyValuePair<int, string>(4, "April")); 
     dDur.Add(new KeyValuePair<int, string>(5, "May")); 
     dDur.Add(new KeyValuePair<int, string>(6, "June")); 
     dDur.Add(new KeyValuePair<int, string>(7, "July")); 
     dDur.Add(new KeyValuePair<int, string>(8, "August")); 
     dDur.Add(new KeyValuePair<int, string>(9, "September")); 
     dDur.Add(new KeyValuePair<int, string>(10, "October")); 
     dDur.Add(new KeyValuePair<int, string>(11, "November")); 
     dDur.Add(new KeyValuePair<int, string>(12, "December")); 

     return dDur; 
    } 
} 

risposta

61

Nel vostro modello di vista si potrebbe avere una proprietà Months:

public IEnumerable<SelectListItem> Months 
{ 
    get 
    { 
     return DateTimeFormatInfo 
       .InvariantInfo 
       .MonthNames 
       .Select((monthName, index) => new SelectListItem 
       { 
        Value = (index + 1).ToString(), 
        Text = monthName 
       }); 
    } 
} 

che potrebbe essere associato direttamente a un DropDownListFor:

<%= Html.DropDownListFor(x => x.SelectedMonth, Model.Months) %> 
+0

Wow tanti modi per la pelle lo stesso coniglio; Ma questo mi piace di più perché sembra "pulito". Probabilmente li spaccherò tutti in un grosso carico e vedremo quali sono i più veloci: op –

+2

L'unico svantaggio di questo approccio, come scritto, è che ci sono 13 mesi di voci in MonthNames (gennaio -> dicembre più un mese "vuoto"). Questo potrebbe essere OK per l'interfaccia utente per avere la casella vuota, ma se si desidera avere un'etichetta selettore personalizzato, è necessario tenere conto di ciò eliminandolo. – Paul

+9

se vuoi fare ciò che @Paul ha menzionato, puoi semplicemente aggiungere '.Where (m =>! String.IsNullOrEmpty (m))' prima dell'istruzione Select – snumpy

1

Perché non si può utilizzare al posto di Dictionary<int, string>List<KeyValuePair<int, string>>

for(int i=1; i<=12; i++) 
    myDict.Add(i, CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(i)); 
3

Si potrebbe provare qualcosa di simile:

Dictionary<int, string> dDur = new Dictionary<int, string>(); 

for (int i = 1; i <= 12; i++) 
{ 
    dDur.Add(i, CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(i)); 
} 

return dDur; 

Ricordare e aggiungere una direttiva using per System.Globalization nella parte superiore della classe.

6

Sulla base darins semplice ed elegante la risposta, ho pensato' d condividere il piccolo metodo di supporto che ho refactored come risultato di vedere questo:

public static string ComboDaysOfWeek(this HtmlHelper helper, string id, string selectedValue) 
{ 
    var newitems = DateTimeFormatInfo 
     .InvariantInfo 
     .DayNames 
     .Select((dayName, index) => new SelectListItem 
     { 
      Value = (index + 1).ToString(), 
      Text = dayName, 
      Selected = (selectedValue == (index + 1).ToString()) 
     }); 

    var result = helper.DropDownList(id, newitems).ToHtmlString(); 
    return result; 
} 

utilizzo:

<%= Html.ComboDaysOfWeek("ActivityStartDay", Model.ActivityStartDay)%> 

[modifica] - questo è in MVC2, quindi la .ToHtmlString() si aggiunge al metodo helper.DropDownList().

+0

Bel lavoro scudiero –

+0

... ordinati !! :) - puoi anche seguire questo approccio con il tuo menu a discesa del mese, anziché collegarlo al tuo modello come alternativa. –

1

Questo ha funzionato per me.

 get 
     { 
      var list = new List<SelectListItem>(); 
      list.Add(new SelectListItem() { Text = "Select Month", Value = "0" }); 
      list.AddRange(DateTimeFormatInfo 
        .InvariantInfo 
        .MonthNames 
        .Where(m => !String.IsNullOrEmpty(m)) 
        .Select((monthName, index) => new SelectListItem 
        { 
         Value = (index + 1).ToString(), 
         Text = monthName 
        }).ToList()); 

      return list; 

     } 
4

La semplicità è l'oro, così nella tua Vista:

<select id="month"> 
    @for (Int16 i = 0; i < 12; i++) 
    { 
     <option value="@i">@DateTimeFormatInfo.InvariantInfo.MonthNames[i]</option> 
    } 
</select> 
1

Bind dritto al vostro discesa

for (int i = 1; i <= 12; i++) 
{ 
    MonthDropdown.Items.Add(new ListItem(CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(i), i.ToString())); 
} 
Problemi correlati