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

问题描述 投票:116回答:15

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

我试过这个......

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

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

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

...它不会抛出异常,但渲染的输出为空(尽管val包含预期值,正如我在调试器中看到的那样)。

感谢提前提示!

编辑

ToLongDateString只是一个例子。实际上我想用而不是ToLongDateStringDateTimeDateTime?的自定义扩展方法:

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参数。

asp.net asp.net-mvc asp.net-mvc-3
15个回答
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")

0
投票

如果我只想以短格式显示日期,我只需使用@ Model.date.ToShortDateString()并打印日期


0
投票

如果您只想显示具有特定格式的日期,只需致电:

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

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

它将产生以下格式,

26-Apr-2013

04/26/13

0
投票

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

在视图中:

而不是DisplayFor使用此代码

<td>

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

</td

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

希望帮助某人。


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

0
投票

在MVC5中我会使用,如果你的模型是日期时间

string dt = Model.ToString("dd/MM/yyy"); 

或者,如果您的模型包含日期时间的属性

string dt = Model.dateinModel.ToString("dd/MM/yyy"); 

这是格式的官方含义:

https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx


-2
投票

仅查看文件调整如下。你可以试试这个。

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

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


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())

26
投票

模型内部的简单格式化输出

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

或者在foreach循环中

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

23
投票

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

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

否则,在填充TextBox或Editor时,您可以像@Darin建议一样,使用[DisplayFormat]属性修饰属性。


9
投票

如果所有DateTime类型的渲染方式与使用自定义DateTime显示模板的方式相同。

在Views文件夹中,在控制器特定视图文件夹下或“共享”文件夹下创建名为“DisplayTemplates”的文件夹(这些工作类似于partials)。

在里面创建一个名为DateTime.cshtml的文件,它将DateTime作为@model并编码你想要如何呈现你的日期:

@model System.DateTime
@Model.ToLongDateString()

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

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

只要遵循将其添加到“DisplayTemplates”文件夹并将文件命名为与您显示的类型相匹配的惯例,MVC将自动使用它来显示您的值。这也适用于使用“EditorTemplates”编辑场景。

Here's some more information on templates


7
投票

我的首选是将格式详细信息保留在视图中而不是视图模型中。所以在MVC4 / Razor中:

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

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

然后我有一个JQuery datepicker绑定到它,并把日期作为一个不同的格式... doh!

看起来我需要将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的格式不匹配,所以需要hackery:

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

这有点弱,但应该涵盖很多案例。


2
投票

适合我

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

2
投票

最近有同样的问题。

我发现在模型中简单地将DataType定义为Date也可以使用(使用Code First方法)

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

1
投票

你可以这样做@item.Date.Value.Tostring("dd-MMM-yy");

© www.soinside.com 2019 - 2024. All rights reserved.