Отображение значения [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)