Как использовать выпадающий список для поля DateTime и поддерживать привязку модели MVC? - PullRequest
0 голосов
/ 18 ноября 2018

Строительные леса Asp.Net Core MVC дали мне этот HTML-код для ввода поля DateTime:

<div class="form-group">
  <label asp-for="ShiftStarts" class="control-label"></label>
  <input asp-for="ShiftStarts" class="form-control" />
  <span asp-validation-for="ShiftStarts" class="text-danger"></span>
</div>

... это хорошо, но я действительно забочусь только о времени, а не одату, и я хочу заменить его выпадающим списком только с выбранным временем (например, 06:00, 06:15, 06:30 и т. д.).

Я думаю, что должен сделать что-то вродеthis:

<select asp-for="ShiftStarts" class="form-control">
    <option disabled value="0">- choose a time -</option>
    @for (int hh = 0; hh < 24; hh++)
    {
        for (int mm = 0; mm < 4; mm++)
        {
            int m = mm * 15;
            <option value="/* what goes here? */">
                @hh.ToString("D2"):@m.ToString("D2")
            </option>
        }
    }
</select>

Как мне добиться этого и работать также с привязкой модели?

1 Ответ

0 голосов
/ 19 ноября 2018

Вы не должны генерировать списки опций вручную на странице просмотра. Попробуйте использовать свойство IEnumerable<SelectListItem> внутри класса viewmodel, которое возвращает список раз на основе заданного интервала, как в примере ниже:

public IEnumerable<SelectListItem> ListOfTimeIntervals 
{ 
    get 
    {
       var list = new List<SelectListItem>();
       // range of hours, multiplied by 4 (e.g. 24 hours = 96)
       int timeRange = 96;

       // range of minutes, e.g. 15 min
       int minuteRange = 15;

       // starting time, e.g. 0:00
       TimeSpan startTime = new TimeSpan(0, 0, 0);       

       // placeholder
       list.Add(new SelectListItem { Text = "Choose a time", Value = "0", Disabled = true }); 

       // get standard ticks
       DateTime startDate = new DateTime(DateTime.MinValue.Ticks); 

       // create time format based on range above
       for (int i = 0; i < timeRange; i++)
       {
           int minutesAdded = minuteRange * i;
           TimeSpan timeAdded = new TimeSpan(0, minutesAdded, 0);
           TimeSpan tm = startTime.Add(timeAdded);
           DateTime result = startDate + tm;

           list.Add(new SelectListItem { Text = result.ToString("HH:mm"), Value = result.ToString("HH:mm") });          
       }

       return list;
   }                                
}

Затем установите атрибут asp-items, чтобы получить список параметров:

<select asp-for="ShiftStarts" asp-items="Model.ListOfTimeIntervals" class="form-control">
</select>

Пример для выбора временного интервала можно найти здесь .

...