2010-05-26 139 views
29

Este método parece estúpido y un poco pesado; hay una manera más óptima de la creación de lo mismo (su MVC para un menú desplegable Visualizar)Crear un menú desplegable en 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; 
    } 
} 

Respuesta

61

En su modelo de vista que podría tener un Months propiedad:

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

que podría ser ligado directamente a un DropDownListFor:

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

Wow tantas maneras de la piel del mismo conejo; Pero a mí me gusta más porque se "siente" limpio. Probablemente los aplaste todos en una carga masiva y veamos cuál más rápido: op –

+2

El único inconveniente de este enfoque tal como está escrito es que hay entradas de 13 meses en MonthNames (enero -> diciembre más un mes "en blanco"). Esto podría estar bien para su interfaz de usuario para tener el cuadro en blanco, pero si desea tener una etiqueta de selector personalizada, entonces debe tener en cuenta que recortándolo. – Paul

+9

si quiere hacer lo que @Paul mencionó, simplemente puede agregar '.Where (m =>! String.IsNullOrEmpty (m))' justo antes de la instrucción Select – snumpy

1

¿Por qué no se puede utilizar en lugar de Dictionary<int, string>List<KeyValuePair<int, string>>

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

Usted podría intentar algo como:

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; 

Recuerda y agrega una directiva de uso para System.Globalization en la parte superior de tu clase.

6

Basado en Darins respuesta simple y elegante, pensé' d comparto el pequeño método de ayuda que refactoré como resultado de ver esto:

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; 
} 

uso:

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

[editar] - esto es en MVC2, por lo tanto la .ToHtmlString() se añade al método helper.DropDownList().

+0

Buen trabajo escudero –

+0

... ordenados !! :) - Obvioulsy podría tomar este enfoque con el menú desplegable de su mes también, en lugar de adjuntarlo a su modelo como alternativa. –

1

Esto funcionó para mí.

 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

simplicidad es oro, por lo que en su opinión:

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

enlazarlo directamente a su desplegable

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