如何在ASP.NET MVC 3中以特定格式呈现DateTime?


117

如果我在模型类中具有类型的属性,DateTime该如何以特定格式呈现它(例如,以ToLongDateString()返回格式)?

我已经试过了...

@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())

...这将引发异常,因为表达式必须指向属性或字段。还有这个...

@{var val = item.MyDateTime.ToLongDateString();
  Html.DisplayFor(modelItem => val);
}

...这不会引发异常,但是呈现的输出为空(尽管val包含期望值,如我在调试器中看到的)。

提前感谢您的提示!

编辑

ToLongDateString仅是一个例子。我实际上想要使用的ToLongDateStringDateTimeand 的自定义扩展方法DateTime?

public static string FormatDateTimeHideMidNight(this DateTime dateTime)
{
    if (dateTime.TimeOfDay == TimeSpan.Zero)
        return dateTime.ToString("d");
    else
        return dateTime.ToString("g");
}

public static string FormatDateTimeHideMidNight(this DateTime? dateTime)
{
    if (dateTime.HasValue)
        return dateTime.Value.FormatDateTimeHideMidNight();
    else
        return "";
}

因此,我认为我无法在ViewModel属性上使用DisplayFormat属性和DataFormatString参数。

Answers:


159

如果您要做的只是以特定格式显示日期,请致电:

@String.Format(myFormat, Model.MyDateTime)

@Html.DisplayFor(...)除非您指定模板或需要使用基于模板构建的内容(例如,对进行迭代),否则使用只是多余的工作IEnumerable<T>。创建模板非常简单,并且还可以提供很多灵活性。在视图文件夹中为当前控制器(或共享视图文件夹)创建一个名为的文件夹DisplayTemplates。在该文件夹内,添加具有要为其创建模板的模型类型的局部视图。在这种情况下,我添加/Views/Shared/DisplayTemplates并添加了一个名为的局部视图ShortDateTime.cshtml

@model System.DateTime

@Model.ToShortDateString()

现在,您可以使用以下行来调用该模板:

@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")

谢谢,这看起来不错,并且此模板参数(“ ShortDateTime”)还解决了我在ataddeini答案的注释中描述的问题。
Slauma 2011年

3
如果类型为“ DateTime?” 而不是“ DateTime”(@ model DateTime?)... ciplay模板将处理可为空或不可为空的日期时间。该文件的名称应保持为“ DateTime.cshtml”。
罗米亚斯2011年

+1必须对此发表评论,在我的应用程序中效果很好!谢谢!
罗素·克里斯坦森

使用@ Html.DisplayFor()并不是多余的工作,即使没有模板也可以呈现模型的html表示。...不要混淆...
Cabuxa.Mapache 2014年

stackoverflow.com/questions/19920603/…包含有助于处理@Romias提及的可空日期时间的代码。
Walter de Jong

171

您可以使用[DisplayFormat]属性装饰视图模型属性:

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

并且在您看来:

@Html.EditorFor(x => x.MyDate)

或者,为了显示值,

@Html.DisplayFor(x => x.MyDate)

我不推荐的另一种可能性是使用弱类型的帮助器:

@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())

1
@Darin:我不需要输入元素,而只需要静态文本输出。我还要提到的是,实际格式是通过DateTime(ToLongDateString仅是示例)的自定义扩展方法创建的,因此不太可能使用DataFormatString
Slauma 2011年

2
@Slauma,怎么样@Html.DisplayFor(x => x.MyDateTime)。@NickLarsen,这就是为什么应该使用视图模型的原因。在我的示例中,我使用此属性装饰了视图模型,并且视图已经与给定视图绑定,这就是其目的。
达林·迪米特洛夫

1
@Slauma,好,在这种情况下,您可以使用自定义显示模板,也可以让视图模型使用string属性,当您在模型和视图模型之间进行映射时,转换将在映射层完成。仍仅在视图中使用Html.DisplayFor)。
Darin Dimitrov

5
@NickLarsen,不,这是每个视图一个视图模型。这是因为人们犯了这个错误,所以诸如“ 如何在一个控制器动作中而不是从另一个控制器动作中排除某些属性的验证”之类的问题就出现了?在SO上如此常见。
达林·迪米特洛夫

1
一年后回到这个问题,我同意每个视图一个模型的观点。我仍然认为与显示选择有关的任何内容都属于视图,而不属于模型。
尼克·拉森

26

模型内部的简单格式输出

@String.Format("{0:d}", model.CreatedOn)

或在foreach循环中

@String.Format("{0:d}", item.CreatedOn)

似乎与已接受的使用答案重复string.Format
Paul Tyng

2
@PaulTyng这个答案对我来说比接受的答案更清楚,odesuk实际上在第一个参数中显示了格式,作为一个新手,对我有帮助。
Dan Beaulieu 2015年

1
我同意,这是对我有帮助的答案。
格伦

26

我使用以下方法内联格式并显示模型中的date属性。

@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")

否则,在填充TextBox或Editor时,您可以像@Darin建议的那样进行操作,用[DisplayFormat]属性装饰属性。


这是我正在寻找的解决方案!
Envil

这是我一直在寻找的解决方案!
Raihan Ridoy

9

如果所有DateTime类型的呈现方式都相同,则可以使用自定义DateTime显示模板。

在您的Views文件夹中,在控制器特定的views文件夹下或“ Shared”文件夹下创建一个名为“ DisplayTemplates”的文件夹(这些工作类似于局部文件)。

里面创建一个名为文件DateTime.cshtml是需要DateTime@model您想如何使您的日期代码:

@model System.DateTime
@Model.ToLongDateString()

现在,您可以在视图中使用它,它应该可以工作:

@Html.DisplayFor(mod => mod.MyDateTime)

只要您遵循将其添加到“ DisplayTemplates”文件夹并命名该文件以匹配要显示的类型的约定,MVC就会自动使用该文件来显示您的值。这也适用于使用“ EditorTemplates”编辑方案。

这是有关模板的更多信息


谢谢,我刚刚对其进行了测试,如果类型为true,则可以正常工作DateTime。但是我有一些可以为空的DateTime属性。我试图在DisplayTemplates文件夹中创建另一个文件,名为NullableDateTime.cshtml和:@using MyHelpers @model System.DateTime? @Model.MyCustomExtension()MyCustomExtension是上的扩展方法DateTime?。但是,当DateTime出现异常时?字段确实为null,告诉我字典要求的模型元素类型DateTime不为null。有没有一种方法可以为可为空的DateTime定义DisplayTemplate?
Slauma

@Slauma:嗯,好问题。我可能会坚持NullableDateTime.cshtml使用@NickLarsen建议并使用的方法@Html.DisplayFor(m => m.MyDateTime, "NullableDateTime")
ataddeini 2011年

如果您的DateTime.cshtml模板设置为“ @model DateTime?”,则无需显式添加模板的名称。而不是“ DateTime”。这样,所有日期(可为空或不可为空)都由同一模板处理...
罗米亚斯2011年

7

我的首选是将格式设置详细信息保留在视图中,而不是在viewmodel中。因此在MVC4 / Razor中:

@Html.TextBoxFor(model => model.DateTime, "{0:d}");

日期时间格式参考:http : //msdn.microsoft.com/zh-cn/library/az4se3k1( v=vs.71) .aspx

然后我有一个绑定到它的Jquery datepicker,然后以不同的格式放置了日期……哦!

看来我需要将日期选择器的格式设置为相同的格式。

因此,我将System.Globalization格式存储在data- *属性中,并在设置

@Html.TextBoxFor(
    model => model.DateTime.Date, 
    "{0:d}", 
    new 
    { 
        @class = "datePicker", 
        @data_date_format=System.Globalization.CultureInfo
                          .CurrentUICulture.DateTimeFormat.ShortDatePattern 
    }));

这是令人毛骨悚然的部分:.net和datepicker的格式不匹配,因此需要黑客:

$('.datePicker').each(function(){
    $(this).datepicker({
        dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy")
    });
});

这有点薄弱,但应该涵盖很多情况。


前3行最重要:)示例并链接到格式定义
-Borik

2

为我工作

<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>

这个问题显然是在使用razor视图引擎,您回答是使用其他语言。
Rhys Bevilaqua 2014年



0

如果我只想以短格式显示日期,则只需使用@ Model.date.ToShortDateString(),它就会以


0

如果您要做的只是以特定格式显示日期,请致电:

@Model.LeadDate.ToString("dd-MMM-yyyy")

@Model.LeadDate.ToString("MM/dd/yy")

它将产生以下格式,

26-Apr-2013

04/26/13

如果@ Model.LeadDate == null会发生什么?
Bimal Das

0

它将以dd/MM/yyyy格式显示在您的视图中

在视图中:

而不是DisplayFor使用此代码

<td>

@(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")

</td

它还会检查date列中的值是否为null,如果为true,则它将显示Date is Empty或该列中的实际格式化日期。

希望可以帮助某人。


0
@{
  string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");        
  @datein
}


-2

这样只能查看文件调整。您可以尝试一下。

@Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)), 
                            "{0: yyyy-MM-dd}")

item.transdate它是您的DateTime类型数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.