如何在Razor视图中使用Lambda表达式格式化日期?

6
我有一个视图,需要以 "dd/MM/yyyy" 格式显示日期。
实际上,它显示为:@Html.LabelFor(model => model.DtNews),我不知道在哪里和如何使用 Format() 函数。
数据是使用 EF 从数据库中检索的。我该怎么办?
6个回答

7
@Html.LabelFor(model => model.DtNews)
@Html.EditorFor(model => model.DtNews)

在您的视图模型上,您可以使用 [DisplayFormat] 属性。

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

现在你可能会告诉我,这个类是由EF框架生成的,对此我会回答你:你不应该在视图中使用EF自动生成的模型。你应该定义和使用视图模型。视图模型是专门根据视图要求定制的类。例如,在这个特定的视图中,您需要以特定的方式格式化日期:这正是视图模型的完美适用场景:

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

如果您的控制器操作需要查询存储库并获取域模型(EF自动生成的实体),并将其映射到视图模型。然后,它将向视图传递此视图模型。


这个字段来自EF:我需要为此创建一个ViewModel吗? - Cris
1
@Cris,在正确架构的ASP.NET MVC应用程序中,您应该为每个视图创建一个视图模型。这样,您就可以完全独立于数据来自何处。今天是一些EF生成的模型,明天是XML文件,后天是您的Facebook帐户。为了使您的ASP.NET MVC应用程序与数据来源松散耦合,您应始终使用视图模型。始终如此 - Darin Dimitrov
^ 同意 - 视图模型绝对是正确的选择。 - Chase Florell

1

我会在你的model.DtNews上添加一个伙伴类

伙伴类将装饰你现有的模型

[MetadataType(NewsMetadata)]
public partial class News // this is the same name as the News model from EF
{ /* ... */ }


/* Metadata type */
public class NewsMetadata
{
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime DtNews { get; set; }
}

这个字段是由Entity Framework生成的,我应该把它放在哪里? - Cris
1
你需要创建一个伙伴类来实现这个功能 - https://dev59.com/N0jSa4cB1Zd3GeqPIcuJ - Chase Florell

1
尝试一下。这对我有用。

@Model.DtNews.Value.ToString("dd-MM-yyyy")


0
如果 DtNews 是一个 DateTime,那么尝试这样做:
@Html.LabelFor(model => model.DtNews.ToString("dd/MM/yyyy"));

0

@Html.LabelFor(model => model.DtNews.ToString("dd/MM/yyyy"))

这应该可以解决问题。

你也可以使用编辑器/显示模板,如此处所讨论的那样。


0

使用以下代码

@Html.TextBoxFor(m => m.MktEnquiryDetail.CallbackDate, "{0:dd/MM/yyyy}")


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