@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个回答

2
这是获取简单日期字符串的最佳方式:
 @DateTime.Parse(Html.DisplayFor(Model => Model.AuditDate).ToString()).ToShortDateString()

3
这个答案的作用是:将 DisplayFor 输出的 HtmlString 转换为 String,然后将其解析为 DateTime,最后格式化为 String。在我看来,这样做有些复杂了。 - Heretic Monkey

2

取代

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

使用

@Model.AuditDate.ToString("MM/dd/yyyy")

这种样式将日期呈现为:06/02/2022

您可以根据需要设置字符串样式。


1
这是对我有效的方法:@Model.AuditDate.Value.ToString("MM/dd/yyyy") - Steve42

2

经过一番搜索,我最终将ThreadCurrentCulture值设置为控制器操作方法中的CultureInfo("en-US")

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 

如果想要在每个视图中使用此设置,则可以考虑一些其他选项

关于CurrentCulture属性的值:

此属性返回的CultureInfo对象及其相关对象,可确定日期、时间、数字、货币值的默认格式,文本的排序顺序、大小写约定和字符串比较。

来源:MSDN CurrentCulture

注意:如果控制器已经使用 CultureInfo("en-US") 或类似设置运行,其中日期格式为 "MM/dd/yyyy",则前面的CurrentCulture属性设置可能是可选的。

在设置CurrentCulture属性后,在视图中添加代码块将日期转换为"M/d/yyyy"格式:

@{  //code block 
    var shortDateLocalFormat = "";
    if (Model.AuditDate.HasValue) {
       shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("M/d/yyyy");
       //alternative way below
       //shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("d");
    }
}

@shortDateLocalFormat

在上面的代码中,@shortDateLocalFormat 变量使用 ToString("M/d/yyyy") 格式化。如果使用 ToString("MM/dd/yyyy"),就像我一开始做的那样,你最终会遇到 前导零问题。同时,正如Tommy所推荐的,ToString("d") 也可以工作。实际上,"d" 代表“短日期模式”,并且可以与不同的文化/语言格式一起使用。

我想上面的代码块也可以用一些 很酷的辅助方法 或类似的东西来替换。

例如

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {     
        shortDateLocalFormat = ((DateTime)date).ToString("M/d/yyyy");
     }

    @shortDateLocalFormat
}

可以与此辅助函数调用一起使用

@DateFormatter(Model.AuditDate)

更新,我发现在使用DateTime.ToString(String, IFormatProvider)方法时有另一种做法。当使用这个方法时,就不需要使用ThreadCurrentCulture属性了。作为第二个参数传递CultureInfo("en-US") --> IFormatProviderDateTime.ToString(String, IFormatProvider)方法。

修改后的辅助方法:

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {
       shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US"));
    }

    @shortDateLocalFormat
}

.NET Fiddle


1

你只需要在你的模型中设置数据注释。

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

在视图(cshtml页面)中

@Html.DisplayFor(model => model.AuditDate)

你不需要做任何其他事情。 希望这对你有用。


0

您可以使用这个方法代替@html.DisplayFor()

@Convert.ToString(string.Format("{0:dd/MM/yyyy}", Model.AuditDate))

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

我在我的控制器上遇到了类似的问题,以下是解决方法:

model.DateSigned.HasValue ? model.DateSigned.Value.ToString("MM/dd/yyyy") : ""

"

DateSigned

" 是我的模型的值。 该行代码的意思是,如果模型的值有值,则格式化该值,否则不显示任何内容。
希望能对您有所帮助。

-1

关于No overload for method 'ToString' takes 1 arguments错误,请参见此答案

您无法格式化可空的DateTime - 您必须使用DateTime.Value属性。

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

提示:在将代码放入视图之前,使用 IntelliSense 在标准类中进行调试总是很有帮助的。在这种情况下,您会得到一个编译错误,这很容易在类中发现。

如果我使用建议的代码,那么会得到这个错误 'Model'与声明'System.Web.Mvc.WebViewPage<TModel>.Model'冲突 - Nick Kahn

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