如何在下拉列表中显示文本属性?

时间:2017-01-26 16:37:51

标签: asp.net-mvc-4 html.dropdownlistfor

我有一个月课

public class Month
{
    public int ID { get; set; } // ex: 1
    public string Name { get; set; } // ex: January
    public string ShortName { get; set; } // ex: JAN

它与我的视图模型绑定

    public List<SelectListItem> Months { get; set; }
    public int SelectedMonth { get; set; }

    public IEnumerable<SelectListItem> MonthItems
    {
        get { return new SelectList(Months, "Id"); }
    }

以下是我的观点:

@Html.DropDownListFor(m => m.SelectedMonth, Model.Months)

下拉列表仅显示ID。如何让它显示月份的Name属性,但仍然“链接”到ID。

我见过其他例子使用过这样的东西......

@Html.DropDownList("Month",
    Enumerable.Range(1, 12).Select(i => new SelectListItem
    {
        Value = i.ToString(),
        Text = System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat.GetMonthName(i)
    }))

...但问题是,我只想要显示实际上有数据的月份在另一个下拉列表中选择的年份。我已经建立了这个查询。重点是,我不能只用所有月份自动填充下拉列表,因为有些月份“不存在”

1 个答案:

答案 0 :(得分:0)

您可以使用最后发布的代码,只使用适用月份列表而不是Enumerable.Range(1, 12)部分。要获取该列表,您可以在数据集上使用GroupBy。你没有发布你的模型供我使用,但一般来说,这看起来像:

var months = dataset.GroupBy(g => g.DateProperty.Month).Select(m => m.Key);

然后:

months.Select(i => new SelectListItem
{
    Value = i.ToString(),
    Text = System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat.GetMonthName(i)
}))

当您运行组时,您最终会得到一个列表列表,其中每个列表都键入一个整数,表示该列表中项目的月份。重要的是,这只会包含数据集中的月份,自然不包括未表示的月份。然后,您只需选择键即可获得只有月份整数的枚举。我不确定您目前如何获得可用年份列表,但也可以使用相同的程序。