Форматирование ошибки DateTime "Шаблоны могут использоваться только с доступом к полю, доступом к ресурсам, индексом одномерного массива".

В представлении MVC Razor я пытаюсь отформатировать поле DateTime, чтобы отображать только время. Используя нижеприведенный код, я получаю сообщение об ошибке "Шаблоны могут использоваться только с доступом к полю, доступом к ресурсам, индексом одномерного массива или однопараметрическими пользовательскими выражениями индексатора".

<td>@(Html.DisplayFor(m=>row.LastUpdatedDate.ToString("HH:mm:ss")))</td>

Любая помощь объясняет, что вызывает эту ошибку и как ее исправить?

Спасибо за вашу помощь.

Ответ 1

DisplayFor ожидает выражение, которое идентифицирует объект, который содержит отображаемые свойства. Он будет использовать встроенные или настраиваемые шаблоны для отображения этого экрана. Вы пытаетесь предоставить логику отображения в качестве этого параметра выражения, что недопустимо.

Используйте

@String.Format("HH:mm:ss", Model.row.LastUpdateDate)

или

@Model.row.LastUpdateDate.ToString("HH:mm:ss")

Ответ 2

У меня была такая же проблема, и я решил проблему. Если вы хотите преобразовать "LastUpdatedDate" в определенный формат, вы можете попробовать следующее:

@Html.TextBoxFor(m=>row.LastUpdatedDate, 
    new { @Value = Convert.ToString(row.LastUpdatedDate.ToShortDateString()) })

Ответ 3

Другим возможным подходом может быть использование методов расширения для достижения того же. Используя этот подход, вы не будете заполнять свои представления жестко закодированным форматом.

Метод расширения

    /// <summary>
    /// Converts a DateTime string to Date string. Also if Date is default value i.e. 01/01/0001
    /// then returns String.Empty.
    /// </summary>
    /// <param name="inputDate">Input DateTime property </param>
    /// <param name="showOnlyDate">Pass true to show only date.
    /// False will keep the date as it is.</param>
    /// <returns></returns>
    public static string ToString(this DateTime inputDate, bool showOnlyDate)
    {
        var resultDate = inputDate.ToString();

        if (showOnlyDate)
        {
            if (inputDate == DateTime.MinValue)
            {
                resultDate = string.Empty;
            }
            else
            {
                resultDate = inputDate.ToString("dd-MMM-yyyy");
            }
        }
        return resultDate;
    }

Просмотр

 @Model.LastUpdateDate.ToString(true).

Ссылка: DateTime to Date в ASP.net MVC

Ответ 4

У вас есть очень простой способ решить эту проблему, и вы можете столкнуться с этой проблемой несколько раз.

Чтобы понять, что происходит, вы передаете метод в качестве параметра. Вместо этого вы должны передать выражение.

Вместо этого

<td>@(Html.DisplayFor(m=>row.LastUpdatedDate.ToString("HH:mm:ss")))</td>

Вы должны сделать

var date = row.LastUpdatedDate.ToString("HH:mm:ss")
<td>@Html.DisplayFor(m=> date)</td>

Ответ 5

Вместо TextBoxДля использования TextBox и укажите формат в поле значения, т.е.

@Html.TextBox("textboxName", Model.dateName.ToString("MMM dd yyyy"))

Используя bootstrap datepicker, это будет выглядеть так:

<div class="input-group date datetime col-md-8 col-xs-7" data-min-view="2" data-date-format="M dd yyyy">
 @Html.TextBox("closeDate", Model.closeDate.ToString("MMM dd yyyy"), new { @class = "form-control", @readonly = "readonly", size = "16", placeholder = Lang.Label_closeDate })
 <span class="input-group-addon btn btn-primary">
  <span class="glyphicon glyphicon-th"></span>
 </span>
</div>