Отображение значения [Date] в EditorFor: метод перегрузки для ToString не принимает 1 аргумент?

В моем INV_Assets Модель У меня определены следующие поля даты:

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

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

        [Required]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
        public DateTime created_date { get; set; }

Тогда на моем Edit() вид у меня следующий form-groupопределяется для каждого из этих значений даты:

<div class="form-group">
        @*@Html.LabelFor(model => model.acquired_date, htmlAttributes: new { @class = "control-label col-md-2" })*@
        <span class="control-label col-md-2">Acquired Date:</span>
        <div class="col-md-10">
            @Html.EditorFor(model => model.acquired_date, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.acquired_date, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @*@Html.LabelFor(model => model.disposed_date, htmlAttributes: new { @class = "control-label col-md-2" })*@
        <span class="control-label col-md-2">Disposed Date:</span>
        <div class="col-md-10">
            @Html.EditorFor(model => model.disposed_date, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.disposed_date, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @*@Html.LabelFor(model => model.created_date, htmlAttributes: new { @class = "control-label col-md-2" })*@
        <span class="control-label col-md-2">Created Date:</span>
        <div class="col-md-10">
            @Html.EditorFor(model => model.created_date, new { htmlAttributes = new { @class = "form-control", @Value = Model.created_date.ToString("yyyy-MM-dd") } })
            @Html.ValidationMessageFor(model => model.created_date, "", new { @class = "text-danger" })
        </div>
    </div>

Теперь, когда created_date имеет значение, я могу открыть форму и EditorFor будет правильно отображать значение. Тем не менее EditorFor()для acquired_date а также disposed_date всегда показываться как mm/dd/yyyy даже если в базе данных сохранено значение - если форма сохранена, а редактор все еще показывает mm/dd/yyyy значение в базе данных меняется на null,

Когда я пытаюсь указать acquired_date а также disposed_date с (напр.) @Value = Model.disposed_date.ToString("yyyy-MM-dd") для htmlAttribute, и то и другое Model.acquired_date.ToString("yyyy-MM-dd") а также Model.disposed_date.ToString("yyyy-MM-dd") пометить как No overload method for 'ToString' takes 1 argument...?

Кто-нибудь может увидеть, что я делаю не так?

В идеале я хочу сохранить введенные значения с любым Date пользователь указывает в EditorFor и с текущим Time в момент сохранения. Затем я хотел бы отобразить значение в формате mm/dd/yyyy в пределах EditorFor если пользователь просматривает запись.

2 ответа

У тебя здесь есть несколько вещей. Во-первых, я бы предположил, что EditorFor генерирует вход с типом date, Для HTML5 date тип ввода, предоставленное значение должно быть в формате ISO (ГГГГ-ММ-ДД). Если он не в этом формате, то он обрабатывается так, как будто вы не указали значение. На посте это затем сохраняется в вашей базе данных, в результате чего нулевые значения. Короче говоря, вам нужно изменить формат отображения на:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyInEditMode = true)]

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

Во-вторых, ваши свойства даты обнуляются. Так что вы не можете позвонить ToString с форматом прямо с них. Вместо этого вы должны сделать что-то вроде:

@Model.disposed_date.Value.ToString("MM/dd/yyyy")

Однако это не удастся, если значение равно нулю, поэтому вам всегда нужно сначала убедиться, что у вас есть значение, либо заключив его в блок if:

@if (Model.disposed_date.HasValue)
{
    ...
}

Или с помощью троичного:

@(Model.disposed_date.HasValue ? Model.disposed_date.Value.ToString("MM/dd/yyyy") : string.Empty)

Формат должен быть [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] (Формат ISO)

Другие вопросы по тегам