如何在ASP.NET MVC 3中以特定格式呈现日期时间?

如何在ASP.NET MVC 3中以特定格式呈现日期时间?,asp.net,asp.net-mvc,asp.net-mvc-3,Asp.net,Asp.net Mvc,Asp.net Mvc 3,如果我的模型类中有一个类型为DateTime的属性,我如何以特定格式呈现它?例如,以ToLongDateString()返回的格式 我试过这个 @Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString()) …引发异常,因为表达式必须指向属性或字段。而这个 @{var val = item.MyDateTime.ToLongDateString(); Html.DisplayFor(modelItem => v

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

我试过这个

@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())
…引发异常,因为表达式必须指向属性或字段。而这个

@{var val = item.MyDateTime.ToLongDateString();
  Html.DisplayFor(modelItem => val);
}
…不会引发异常,但呈现的输出为空(尽管
val
包含预期值,正如我在调试器中看到的那样)

提前谢谢你的提示

编辑

ToLongDateString
只是一个例子。实际上,我想使用的不是
ToLongDateString
而是
DateTime
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
参数。

您可以使用以下属性装饰视图模型属性:

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

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

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

在内部创建一个名为
DateTime.cshtml
的文件,该文件将
DateTime
作为
@model
并对日期的呈现方式进行编码:

@model System.DateTime
@Model.ToLongDateString()
现在,您可以在视图中使用它,它应该可以工作:

@Html.DisplayFor(mod => mod.MyDateTime)
只要您遵循将其添加到“DisplayTemplates”文件夹并命名文件以匹配您正在显示的类型的约定,MVC将自动使用该文件来显示您的值。这也适用于使用“EditorTemplates”编辑场景


.

如果您只想用特定格式显示日期,只需调用:

@String.Format(myFormat, Model.MyDateTime)
使用
@Html.DisplayFor(…)
只是额外的工作,除非您指定了一个模板,或者需要使用基于模板的东西,比如迭代
IEnumerable
。创建模板非常简单,而且可以提供很大的灵活性。在视图文件夹中为当前控制器(或共享视图文件夹)创建一个名为
DisplayTemplates
的文件夹。在该文件夹中,添加具有要为其生成模板的模型类型的局部视图。在本例中,我添加了
/Views/Shared/DisplayTemplates
,并添加了名为
ShortDateTime.cshtml
的部分视图

@model System.DateTime

@Model.ToShortDateString()
现在,您可以使用以下行调用该模板:

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

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

@String.Format("{0:d}", model.CreatedOn)
或者在foreach循环中

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

只有视图文件可以这样调整。你可以试试这个

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

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

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

格式打印日期。如果您只想以特定格式显示日期,只需调用:

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

@Model.LeadDate.ToString("MM/dd/yy")
它将产生以下格式,

26-Apr-2013

04/26/13

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

@Html.TextBoxFor(model => model.DateTime, "{0:d}");
日期时间格式参考:

然后我有一个JQuery日期选择器绑定到它,它将日期作为不同的格式…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的格式不匹配,因此需要黑客技术:

$('.datePicker').each(function(){
    $(this).datepicker({
        dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy")
    });
});
这有点弱,但应该涵盖很多情况。

适合我

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

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

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

否则,在填充文本框或编辑器时,您可以按照@Darin的建议,使用
[DisplayFormat]
属性修饰属性。

最近也遇到了同样的问题

我发现在模型中将数据类型简单地定义为日期同样有效(使用代码优先的方法)


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

视图中:

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

@Model.LeadDate.ToString("MM/dd/yy")
使用此代码而不是
DisplayFor

<td>

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

</td

@(item.Startdate.HasValue?item.Startdate.Value.ToString(“dd/MM/yyyy”):“日期为空”)

在MVC5中,如果您的模型是datetime,我会使用

string dt = Model.ToString("dd/MM/yyy"); 
string dt = Model.dateinModel.ToString("dd/MM/yyy"); 
或者如果您的模型包含datetime的属性

string dt = Model.ToString("dd/MM/yyy"); 
string dt = Model.dateinModel.ToString("dd/MM/yyy"); 
以下是格式的官方含义:


您可以这样做
@item.Date.Value.Tostring(“dd-MMM-yy”)

@Darin:我不需要输入元素,只需要静态文本输出。我还应该提到,实际格式是由
DateTime
的自定义扩展方法创建的(ToLongDateString只是一个示例),因此我不太可能使用
DataFormatString
@Slauma,那么
@Html.DisplayFor(x=>x.MyDateTime)
呢@NickLarsen这就是为什么应该使用视图模型的原因。在我的示例中,我使用此属性装饰视图模型,并且视图已绑定到给定视图,这就是它的用途。@Slauma,好的,在这种情况下,您可以使用自定义显示模板,或者让视图模型使用字符串属性,当您在模型和视图模型之间进行映射时,转换将在映射层完成(这样你仍然只能在视图中使用Html.DisplayFor)。@NickLarsen,不,每个视图只有一个视图模型。正是因为人们犯了这个错误,所以像如何在一个控制器操作中而不是在另一个控制器操作中排除验证中的某些属性这样的问题非常常见