2010-05-26 42 views
29

这种方法看起来很愚蠢,有点沉重;有没有创造同样的事情(它的MVC视图下拉列表)在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; 
    } 
} 

回答

61

在您的视图模型,你可以有一个Months属性:

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

它可以直接绑定到DropDownListFor

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

哇这么多的方法对皮肤同兔;但我最喜欢这个,因为它感觉干净。我可能会将它们全部推入大容量并查看哪些是最快的:op – 2010-05-26 10:00:26

+2

这种写法的唯一缺点是MonthNames(1月 - > 12月加上“空白”月份)有13个月的条目。这可能对您的UI有空白框是可以的,但如果您想要自定义选择器标签,那么您需要通过修剪它来解决这个问题。 – Paul 2010-06-27 22:40:35

+9

如果你想做@Paul提到的,你可以简单地在Select语句 – snumpy 2011-05-24 19:39:20

1

更优化的方式为什么你不能使用的,而不是Dictionary<int, string>List<KeyValuePair<int, string>>

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

你可以尝试类似:

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; 

请记住并在班级顶部添加System.Globalization的使用指令。

6

基于darins古朴典雅的答复,我认为我会d分享我看到这个重构的小帮手方法:

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

用法:

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

[编辑] - 这是在MVC2,因此.ToHtmlString()被添加到helper.DropDownList()方法。

+0

不错的工作乡绅 – 2010-05-26 11:55:27

+0

...排序!! :) - 你明显可以采取这种方法与你的月份下拉,而不是作为替代附加到您的模型。 – 2010-05-26 13:25:28

1

这对我有用。

 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

简单是金,所以在你的视野:

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

绑定它直接到您的下拉

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