MVC3 установить значение для типа текстового поля datetime в опере - PullRequest
2 голосов
/ 30 марта 2012

В моем приложении ASP.NET MVC3 есть дата и время:

<div class="editor-field">
    @Html.EditorFor(model => model.Article.PublishedDate)
    @Html.ValidationMessageFor(model => model.Article.PublishedDate)
</div>

В Opera он делает специальный ввод для даты и времени, но когда я редактирую свою модель, она пуста, и я хочу установить ее значение. В других браузерах это обычное текстовое поле с установленной датой и временем. Код, сгенерированный благодаря этому коду:

<input class="text-box single-line" data-val="true" data-val-required="Publish date is required" id="Article_PublishedDate" name="Article.PublishedDate" type="datetime" value="30.3.2012 10:00:00" data-default-value=""/>

Как это исправить и установить дату и время в Opera тоже?

Ответы [ 2 ]

5 голосов
/ 12 апреля 2012

Вам необходимо отформатировать дату и время в соответствии со RFC3339 стандартом

HTML5 спецификации даты и времени ввода: http://dev.w3.org/html5/markup/input.datetime.html

Таким образом, ваше значение должно быть отформатировано примерно так:

<input ... type="datetime" value="2012-03-30T10:00:00" ... />

Чтобы форматировать дату как RFC3339, вы можете позвонить:

DateTime.ToString("yyyy-MM-ddThh:mm:ssZ");

Это можно сделать, добавив атрибут DisplayFormatAttribute к вам Article.PublishedDate:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-ddThh:mm:ssZ}")]
public DateTime PublishedDate { get; set; }

Проблема сейчас (по крайней мере для меня) в том, что свойство теперь всегда остается таким же.Вы можете использовать шаблон EditorFor для этого:

@model DateTime?

@{
    var attributes = new Dictionary<string, object>();

    attributes.Add("type", "datetime");

    attributes.Add("class", "text-box single-line");

    //since this is a constraint, IsRequired and other constraints 
    //won't necessarily apply in the browser, but in case script 
    //turns off readonly we want the constraints passed
    if (ViewData.ModelMetadata.IsReadOnly)
    {
        attributes.Add("readonly", "readonly");
    }

    if (ViewData.ModelMetadata.IsRequired)
    {
        attributes.Add("required", "required");
    }
}
@Html.TextBox("", Model.HasValue ? Model.Value.ToUniversalTime().ToString("yyyy-MM-ddThh:mm:ssZ") : String.Empty, attributes)

На основе DateTime.cshtml

И для локальных дат:

@model DateTime?
@{
  var attributes = new Dictionary<string, object>();

  attributes.Add("type", "datetime-local");
  attributes.Add("class", "text-box single-line");

  if (ViewData.ModelMetadata.IsRequired)
  {
    attributes.Add("required", "required");
  }
}
@Html.TextBox("", Model.HasValue ? Model.Value.ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss") : String.Empty, attributes)

На основе DateTime-Local.cshtml

0 голосов
/ 05 апреля 2012

Способ отображения HTML в MVC не подлежит изменению между браузерами.

type="datetime" - это новый тип ввода в HTML5 ( документация )

Я подозреваю, что вы используете более старую версию Opera, которая еще не поддерживает этот тип ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...