我有一个月课
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)
}))
...但问题是,我只想要显示实际上有数据的月份在另一个下拉列表中选择的年份。我已经建立了这个查询。重点是,我不能只用所有月份自动填充下拉列表,因为有些月份“不存在”
答案 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)
}))
当您运行组时,您最终会得到一个列表列表,其中每个列表都键入一个整数,表示该列表中项目的月份。重要的是,这只会包含数据集中的月份,自然不包括未表示的月份。然后,您只需选择键即可获得只有月份整数的枚举。我不确定您目前如何获得可用年份列表,但也可以使用相同的程序。