Редактор для ввода только времени, не может установить 24-часовой формат - PullRequest
3 голосов
/ 23 марта 2020

Я пробую разные вещи, такие как разные DataFormatString или даже разные элементы управления, чтобы сделать так, чтобы он использовал формат 24, но сохранил формат AM / PM, как сделать это в формате 24hs?

РЕДАКТИРОВАТЬ : После дополнительных поисков я понимаю, что этот код показывает некоторым людям 24-часовой формат, поэтому я мог бы сформулировать следующее: Что можно настроить как AM / PM в моем P C? Я уже изменил локаль в web.config на 24 часа, но результат тот же. Мои региональные настройки также установлены на 24 часа.

Просмотр:

<div class="col-md-2">
    Horario teórico Desde
    @Html.EditorFor(model => model.HorarioTeoricoDesde, new { htmlAttributes = new { @class = "form-control form-control-sm" } })
    @Html.ValidationMessageFor(model => model.HorarioTeoricoDesde, "", new { @class = "text-danger" })
</div>

ViewModel:

[Display(Name = "Horario Teorico Desde")]
[Required(ErrorMessage = "El Horario Teorico Desde es Requerido")]
[DataType(DataType.Time)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:HH:mm}")]
public DateTime? HorarioTeoricoDesde { get; set; }

Мой Региональные настройки 24 часа, испанский sh язык. Это мой web.config:

  <system.web>
    <globalization culture="es-AR" uiCulture="es-AR" />

Вот как я это вижу:

This is how i see it:

Спасибо !!

Ответы [ 3 ]

2 голосов
/ 31 марта 2020

Когда вы используете DataType.Time, вход имеет тип time.

Тип ввода time является новым в HTML5. Поддержка этого типа все еще очень плохая. Несмотря на то, что вы видите время в формате ЧЧ: ММ AM / PM (24 версия (в данный момент разрабатывается)), на серверной части оно по-прежнему работает в 24-часовом формате, вы можете попробовать использовать некоторые базовые значения c javascript для смотрите это.

Пример: Использование bootstrap -timepicker .

ViewModel: -

public class Time24ViewModel
{
    [DataType(DataType.Time)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:HH:mm}")]
    public DateTime? HorarioTeoricoDesde { get; set; }

    [Display(Name = "Horario Teorico Desde")]
    [Required(ErrorMessage = "El Horario Teorico Desde es Requerido")]
    public string HorarioTeoricoDesdeStr
    {
        get
        {
            return HorarioTeoricoDesde.HasValue ? HorarioTeoricoDesde.Value.ToString("HH:mm") : "";
        }
        set
        {
            if (!string.IsNullOrWhiteSpace(value))
            {
                var time = TimeSpan.Parse(value);
                HorarioTeoricoDesde = new DateTime(time.Ticks);

            }
        }
    }
}

Контроллер: -

public class TimeController : Controller
{
    // GET: Time
    public ActionResult Time24()
    {
        var model = new Time24ViewModel
        {
            HorarioTeoricoDesde = DateTime.Now
        };
        return View(model);
    }
    [HttpPost]
    public ActionResult Time24(Time24ViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        return View(model);
    }
}

Вид: -

<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-timepicker/0.5.2/js/bootstrap-timepicker.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-timepicker/0.5.2/css/bootstrap-timepicker.css" rel="stylesheet" />

@using (Html.BeginForm("Time24", "Time", FormMethod.Post)) { 
<div class="col-md-2">
    Horario teórico Desde
    @Html.EditorFor(model => model.HorarioTeoricoDesdeStr, new { htmlAttributes = new { @class = "form-control form-control-sm" } })
    @Html.ValidationMessageFor(model => model.HorarioTeoricoDesdeStr, "", new { @class = "text-danger" })
</div>
<div class="col-md-2">
    <input type="submit" class="btn btn-dark" value="Submit"/>
</div>
}

<script>
    $('#HorarioTeoricoDesdeStr').timepicker({
        showMeridian: false
    });
</script>

(проверено)

0 голосов
/ 27 марта 2020

Изменение локальной не поможет (!) -> Дело в том, что он дает разные выходные данные в разных локалях по умолчанию (на стороне клиента).
Например:

    en_SS: 12:00 AM
    fr_BL: 00:00
    ps_AF: 0:00
    es_CO: 12:00 a.m.

Чтобы вы могли попробовать

@item.Date.ToString("0:HH:mm")

ИЛИ

Чтобы добавить свойство в вашу модель, добавьте этот код:

public string ReturnDateForDisplay
{
    get
    {
       return this.ReturnDate.ToString("0:HH:mm");
    }
}

Затем в вашем PartialView:

@Html.EditorFor(model => model.ReturnDateForDisplay)

Для изменения в создать представление все, что вам нужно сделать, это применить нужный формат в помощнике html вызов, ie.

 @Html.TextBoxFor(m => m.YOUR_INPUT, "{0:HH:mm}")

РЕДАКТИРОВАТЬ чтобы получить желаемый результат (с указанием plceholder и проверки):

Используйте перегрузку TextBoxFor () с аргументом htmlAttributes. Этот аргумент должен быть анонимным объектом со всеми атрибутами, которые вы будете sh назначать входным данным.
Например, если вы хотите установить атрибуты заполнителя и класса:

@Html.TextBoxFor( model => model.HorarioTeoricoDesde, "{0:HH:mm}", new { 
       @class = "form-control datecontrol", type = "date" })

Другие возможные решения : ASP. Net Forum
Дополнительная информация:
Предпочтительным подходом является использование общего формата для всех потенциальных проблем, и тогда клиенты (ваш веб-интерфейс) могут отформатировать Значение правильно, прежде чем отправить его на сервер / API. Для дат и времени дат используйте формат ISO 8601, и допустимый тип переменной должен быть строкой на заднем конце.

Значение времени будет указано, например, как 13:24 (ЧЧ: мм). Рекомендуется по нескольким причинам:

  • Формат даты не изменяется между форматами.
  • В строках не обрабатываются части значений неправильно.
  • UT C / смещение не возникает между клиентом и сервером.
  • Сортировка строки формата ISO.
0 голосов
/ 25 марта 2020

Когда вы используете [DataType(DataType.Time)], метод EditorFor визуализирует ввод типа time.
Согласно документации , этот ввод показывает время в формате, соответствующем браузеру. locale.
Внутренне, value входных данных по-прежнему в 24-часовом формате, это чисто о том, как отображается время.

Например:

<input type="time" value="23:13" class="text-box single-line" data-val="true" id="HorarioTeoricoDesde" name="HorarioTeoricoDesde">

Результат в этом в Firefox на английском языке sh:
enter image description here

Если вы хотите перезаписать это, на этот вопрос есть несколько ответов.


Старый ответ, в некоторых случаях работает, но по неправильной причине:
Если тип свойства DateTime, вам необходимо использовать это

[DataType(DataType.DateTime)]

вместо

[DataType(DataType.Time)]

С другой стороны, если вам нужна только часть времени, вы можете рассмотреть возможность использования TimeSpan вместо DateTime, но это зависит от вашего проекта.

...