在C#ASP.NET MVC中创建月份下拉列表

Chr*_*Kee 32 c# asp.net-mvc c#-3.0

这种方法看起来很愚蠢而且有点沉重; 有没有更好的方法来创建相同的东西(它的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 68

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

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

可以直接绑定到DropDownListFor:

<%= Html.DropDownListFor(x => x.SelectedMonth, Model.Months) %>
Run Code Online (Sandbox Code Playgroud)

  • 如果你想做@Paul提到的事情,你可以在Select语句之前添加`.Where(m =>!String.IsNullOrEmpty(m))` (9认同)
  • 这种方法的唯一缺点是在MonthNames中有13个月的条目(1月 - > 12月加上"空白"月份).这可能适用于您的UI有空白框,但如果您想要一个自定义选择器标签,那么您需要通过修剪它来解决这个问题. (2认同)

jim*_*lan 6

基于darins简单而优雅的回复,我想我会分享我看到这个结果后重构的小辅助方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

用法:

<%= Html.ComboDaysOfWeek("ActivityStartDay", Model.ActivityStartDay)%>
Run Code Online (Sandbox Code Playgroud)

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


Geo*_*rge 6

简单就是黄金,所以在你的视图中:

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