Asp.net mvc 如何使用Html.DropDownListFor(…)格式化日期时间

Asp.net mvc 如何使用Html.DropDownListFor(…)格式化日期时间,asp.net-mvc,html.dropdownlistfor,Asp.net Mvc,Html.dropdownlistfor,我想要一个短日期格式的下拉列表。 但以下这些都不起作用。 我有 在我看来,我试过了 <div>@Html.DropDownListFor(m => m.TripDepartures.First().DepartrueDate, new SelectList(Model.TripDepartures.Select(s=> new SelectListItem { Value = s.Id.ToString(), Text = s.DepartrueDate

我想要一个短日期格式的下拉列表。 但以下这些都不起作用。 我有

在我看来,我试过了

<div>@Html.DropDownListFor(m => m.TripDepartures.First().DepartrueDate, new SelectList(Model.TripDepartures.Select(s=>
         new SelectListItem { Value = s.Id.ToString(), Text = s.DepartrueDate.Value.ToShortDateString() }).ToList()))</div>
</div>
@Html.DropDownListFor(m=>m.TripDeferences.First().DeferrueDate,新选择列表(Model.TripDeferences.Select)(s=>
新建SelectListItem{Value=s.Id.ToString(),Text=s.departureDate.Value.ToSortDateString()}.ToList())
它没有产出; 我也试过了

 <div>@Html.DropDownListFor(m => m.TripDepartures.First().DepartrueDate, new SelectList(Model.TripDepartures, "Id","DepartrueDate"))</div>
                </div>
@Html.DropDownListFor(m=>m.tripDeferences.First().deferrueDate,新选择列表(Model.tripDeferences,“Id”,“deferrueDate”))
它给出了

我怎样才能得到一个短日期?

你可以欺骗系统并绑定到字符串字段而不是日期字段:

[Property]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime? DepartrueDate { get; set; }

public string DepartrueDateText { get { return DepartrueDate.ToShortDataString(); } }
但不要忘记您的空检查。:)


我经常这样做是为了枚举字段获得要识别的[Display(Name=”“)]属性。

理想情况下,您不希望将域实体(TripDepartments)传递给Controller查看。这不是一个好的设计实践

相反,您希望传递SelectListItem

看法 难道不是:

@Html.DropDownListFor(m => m.TripDepartures.First().Id.ToString(), new SelectList(Model.TripDepartures.Select(s=>
     new SelectListItem() { Value = s.Id.ToString(), Text = s.DepartrueDate.Value.ToShortDateString() }).ToList()))
如果不起作用: 你确定Model.TripDeferences有元素吗

我记得我自己在模型中添加了几次SelectList,因此您可以尝试在模型中添加SelectList类型的属性。您可以为每个DepartureDate添加SelectListItem,自行设置id和值,并自行循环和调试。它与Linq代码基本相同,但我记得我这样做是有原因的

Model.DepartureDateSelectList = new SelectList();
foreach (TripDeparture tripDeparture in Model.TripDepartures) {
{
    SelectListItem item = new SelectListItem();
    item.Value = tripDeparture.Id.ToString();
    item.Text = tripDeparture.DepartueDate.Value.ToShortDateString(); //Didn't do a null check, since you didn't do it in you code either. You should change DataType to non-nullable or perform a check and handle if it's null
    Model.DepartureDateSelectList.Add(item);
}
如果确实看到该列表,但未设置默认的选定项,则将建议的更改应用于选定项表达式。如果仍然没有正确设置,您可以自己在循环中设置选定的属性。DropDownList for中有一个错误,导致所选项目不总是被设置

public class HomeModel
{
    public int SelectedTripDepartureId { get; set; }
    public IList<SelectListItem> AvailableTripDepartures { get; set; }

    public HomeModel()
    {
        AvailableTripDepartures = new List<SelectListItem>();
    }
}
public class HomeController : Controller
{
    public ActionResult Index()
    {
        HomeModel model = new HomeModel();
        model.AvailableTripDepartures = GetTripDepartures()
            .Select(s => new SelectListItem
            {
                Value = s.Id.ToString(),
                Text = s.DepartrueDate.Value.ToString("MM/dd/yyyy")
            }).ToList();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(HomeModel model)
    {
        int tripDepartureId = model.SelectedTripDepartureId;

        DateTime? departrueDate = GetTripDepartures()
            .Where(x => x.Id == tripDepartureId)
            .Select(x => x.DepartrueDate)
            .FirstOrDefault();

        return View(model);
    }

    // This data will be from persistent storage such as database.
    private IList<TripDeparture> GetTripDepartures()
    {
        return new List<TripDeparture>
        {
            new TripDeparture {Id = 1, DepartrueDate = DateTime.Now.AddDays(1)},
            new TripDeparture {Id = 2, DepartrueDate = DateTime.Now.AddDays(2)},
            new TripDeparture {Id = 3, DepartrueDate = DateTime.Now.AddDays(3)},
        };
    }
}
public class TripDeparture
{
    public int Id { get; set; }
    public DateTime? DepartrueDate { get; set; }
}
@Html.DropDownListFor(m => m.TripDepartures.First().Id.ToString(), new SelectList(Model.TripDepartures.Select(s=>
     new SelectListItem() { Value = s.Id.ToString(), Text = s.DepartrueDate.Value.ToShortDateString() }).ToList()))
Model.DepartureDateSelectList = new SelectList();
foreach (TripDeparture tripDeparture in Model.TripDepartures) {
{
    SelectListItem item = new SelectListItem();
    item.Value = tripDeparture.Id.ToString();
    item.Text = tripDeparture.DepartueDate.Value.ToShortDateString(); //Didn't do a null check, since you didn't do it in you code either. You should change DataType to non-nullable or perform a check and handle if it's null
    Model.DepartureDateSelectList.Add(item);
}