我有一个下拉菜单,只需要显示月/日/年,没有时间。它绑定到模型提供的 IEnumerable<DateTime>。使用默认方法时,将显示一个长日期:
@Html.DropDownList("SelectedDate", new SelectList(Model.Dates, Model.SelectedDate));
为下拉列表中每个列表项的文本字段生成"6/24/2013 12:00:00 AM"。
如何显示文本字段的简短日期,如下所示:
'6/24/2013'
我想坚持使用模型数据的 DateTime 结构,但我想,我可以生成具有自定义属性的自定义对象列表并运行以下内容:
@Html.DropDownList("SelectedDate", new SelectList(Model.DisplayDates, "Value", "ShortDate", Model.SelectedDate));
但也许有一个更优雅的解决方案?
制作副本,遍历它,更改日期以使其更适合
@{
List<string> shortDates = new List<string>();
for (var i = 0; i < Model.Dates.Count; i++)
{
shortDates.Add(Model.Dates.ElementAt(i).ToShortDateString());
}
}
使用副本
@Html.DropDownList("SelectedDate", new SelectList(shortDates, Model.SelectedDate));
基本上,这是我发现的唯一丑陋的解决方案,可用于自定义 DateTime 对象的下拉列表,而不会失去在下拉列表中设置所选日期的能力。
在日期时间对象周围使用简单的包装类:
public class DisplayDateTime
{
private DateTime dt;
private string shortDate;
public DisplayDateTime(DateTime d)
{
dt = d;
shortDate = dt.ToString("d");
}
public DateTime Date
{
get
{
return dt;
}
}
public string ShortDate
{
get
{
return shortDate;
}
}
}
然后由模型使用:
public List<DisplayDateTime> GetDisplayDates()
{
var displayDates = new List<DisplayDateTime>();
foreach (var d in Dates)
{
displayDates.Add(new DisplayDateTime(d));
}
return displayDates;
}
然后像这样喂给剃须刀:
@Html.DropDownList("SelectedDate", new SelectList(Model.GetDisplayDates(), "Date", "ShortDate", Model.SelectedDate));