@Html.DisplayFor - DateFormat ("mm/dd/yyyy")

111

我有以下剃刀代码,我希望它以mm/dd/yyyy日期格式显示:

Audit Date: @Html.DisplayFor(Model => Model.AuditDate)

我尝试了许多不同的方法,但这些方法都在我的情况下无效。

我的 AuditDate 是一个 DateTime? 类型。

我尝试过类似于这样的东西,但是出现了这个错误:

@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())

额外信息:模板只能与字段访问、属性访问、单维数组索引或带单个参数的自定义索引器表达式一起使用。

尝试了这个:

@Html.DisplayFor(Model => Model.AuditDate.ToString("mm/dd/yyyy"))

方法 'ToString' 没有接受 1 个参数的重载

17个回答

192
如果您使用 DisplayFor,那么您必须通过DisplayFormat属性定义格式或使用自定义显示模板。(预设的所有DisplayFormatString列表可以在此处找到:这里。)
[DisplayFormat(DataFormatString = "{0:d}")]
public DateTime? AuditDate { get; set; }

或创建视图 Views\Shared\DisplayTemplates\DateTime.cshtml

@model DateTime?
@if (Model.HasValue)
{
    @Model.Value.ToString("MM/dd/yyyy")
}

这将适用于所有的 DateTime,即使您编码的是时间。如果您只想应用于仅包含日期的属性,则可以使用 Views\Shared\DisplayTemplates\Date.cshtmlDataType 属性:

[DataType(DataType.Date)]
public DateTime? AuditDate { get; set; }

最后一种选择是不使用DisplayFor,而是直接呈现属性:

@if (Model.AuditDate.HasValue)
{
    @Model.AuditDate.Value.ToString("MM/dd/yyyy")
}

我按照你的建议创建了一个displayTemplate,当我复制并粘贴你在模板中的代码时,出现了这个错误:“没有重载方法'ToString'接受1个参数”。 - Nick Kahn
4
我认为应该是[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")] - user3559349
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] 对于土耳其有效,谢谢。 - zapoo
@Mac:你是什么意思?它们确实可以工作,但也许只是在你的特定情况下不能。没有更多信息,我无法确定你的情况是什么。 - Chris Pratt
如果您希望编辑器也使用该格式,请将 ApplyFormatInEditMode = true 添加到属性中:[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]。显然,但当您没有时间浪费复制粘贴时,这个提示可能会从智能感知中溜过您的鼻子,就像我一样 :) - Heki
是的,但在现代Web开发中,你几乎永远不应该实际使用它。如果你正在使用HTML5输入类型(而你应该这样做),那么编辑格式必须是ISO,这几乎从来不是你也要向用户显示的实际格式。这是使用视图模型的另一个原因:为情况自定义格式。 - Chris Pratt

25

我一直在使用以下代码的改变:

旧代码:

 <td>
  @Html.DisplayFor(modelItem => item.dataakt)
 </td>

新建:

<td>
 @Convert.ToDateTime(item.dataakt).ToString("dd/MM/yyyy")
</td>

这是回答吗?还是什么? - Maciej Jureczko
2
是的,这只是主题问题的简单解决方案。我认为这可能对某些人有所帮助。 - Piotr Mirek
好的,我建议您将"I have been using this change in my code"改为明确说明这是一种解决方案的内容。 - Maciej Jureczko
简单方便的答案,对我有用,谢谢! - Scanner
如果dataakt是DateTime类型会出现什么问题? - Emanuele

20

如果您只需输出该模型属性的值,则不需要使用DisplayFor html助手,只需直接使用正确的字符串格式进行调用即可。

Audit Date: @Model.AuditDate.Value.ToString("d")

应输出

Audit Date: 1/21/2015

最后,您的审核日期可能为空,因此在尝试格式化可空值之前,应进行条件检查。

@if (item.AuditDate!= null) { @Model.AuditDate.Value.ToString("d")}

搜索你所遇到的错误提供了这个答案,它显示在Html助手中使用单词Model导致了这个错误。例如,使用@Html.DisplayFor(Model=>Model.someProperty)。将这些更改为使用其他内容而不是Model,例如:@Html.DisplayFor(x=>x.someProperty)或在这些助手中将大写的M更改为小写的m


1
如果我使用@Model.AuditDate.Value.ToString("d"),会返回以下错误信息:只能将模板用于字段访问、属性访问、单维数组索引或单参数自定义索引器表达式。 - Nick Kahn
@AbuHamzah - 听起来你还在试图将这个放入Html.DisplayFor 帮助器中。不要那样做。另外,你确定它是在那一行抛出错误,而不是其他你正在尝试使用DisplayFor帮助器的属性吗? - Tommy
如果我使用@Model...,我会收到以下错误:'Model'与声明的System.Web.Mvc.WebViewPage<TModel>.Model冲突。 - Nick Kahn
@AbuHamzah 请查看我更新的答案中的最后一段。 - Tommy

12
你可以在视图模型上使用 [DisplayFormat] 属性,以便在整个项目中应用此格式。
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public Nullable<System.DateTime> Date { get; set; }

1
几乎是我需要的,Visual Studio为我完成了其余的工作,我最终得到了以下代码: [System.ComponentModel.DataAnnotations.DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd MMM yyyy}")] 然后是 public DateTimeOffset MyExpirationDate { get; set; } - Rin and Len

7

6

对我来说,只需使用

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

1
这个方法对我也有效,但使用时需小心。如果您打算在整个应用程序中传播StartDate的格式,则可以使用;否则,应采取更精细的方法。 - CesarB

5

我是这样实现类似功能的:

  1. 使用TextBoxFor以所需格式显示日期,并将字段设置为只读
@Html.TextBoxFor(Model => Model.AuditDate, "{0:dd-MMM-yyyy}", new{@class="my-style", @readonly=true})

在css中为TextBox设置零外框零边框

.my-style {
    outline: none;
    border: none;
}

完成了 :)


1
但是你为什么要这样做呢? - CodeCaster
因为其他任何方法都对我不起作用,而它节省了我大量编码时间。此外,最终结果是只读的,并且没有边框,因此看起来不像文本框。 - Akshat

4

您可以使用转换功能

 <td>@Convert.ToString(string.Format("{0:dd/MM/yyyy}", o.frm_dt))</td> 

这是一个非常优秀的解决方案,因为它允许在不改变源模型的情况下转换来自模型的数据。 - CesarB

3
在视图中替换这个:
@Html.DisplayFor(Model => Model.AuditDate.Value.ToShortDateString())

随着:

@if(@Model.AuditDate.Value != null){@Model.AuditDate.Value.ToString("dd/MM/yyyy")}
else {@Html.DisplayFor(Model => Model.AuditDate)}

解释:如果AuditDate的值不为空,则将日期格式化为dd/MM/yyyy,否则保留原样,因为它没有值。


2
也许尝试简单些。
@(Model.AuditDate.HasValue ? Model.AuditDate.ToString("mm/dd/yyyy") : String.Empty)

此外,您可以使用许多类型的字符串格式,例如.ToString("dd MMM, yyyy")和.ToString("d")等。


出现错误:'Model' 与声明 'System.Web.Mvc.WebViewPage<TModel>.Model' 冲突。 - Nick Kahn
如果我使用了@model,它就无法识别。 - Nick Kahn
@AbuHamzah - 我错了,当在HTML页面中使用时应该是大写的 M,而在声明时应该是小写的 m - Tommy
仍然出现错误,请查看我对Tommy答案的回复。 - Nick Kahn
1
当我使用ToString("mm/dd/yyyy")时,出现了“方法'ToString'没有接受1个参数的重载”错误信息。 - Nick Kahn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接