如何在ASP.NET MVC 3中以特定格式呈现date时间?
如果我在我的模型类中有一个DateTime
types的属性,我怎样才能以特定的格式渲染它 – 例如ToLongDateString()
返回的格式?
我试过这个…
@Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString())
…因为expression式必须指向一个属性或者字段,所以抛出一个exception。 和这个…
@{var val = item.MyDateTime.ToLongDateString(); Html.DisplayFor(modelItem => val); }
…它不会抛出exception,但呈现的输出是空的(虽然val
包含期望的值,我可以在debugging器中看到)。
提前感谢提示!
编辑
ToLongDateString
只是一个例子。 我真正想要使用而不是ToLongDateString
是DateTime
和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
参数。
如果您只想以特定的格式显示date,请致电:
@String.Format(myFormat, Model.MyDateTime)
使用@Html.DisplayFor(...)
只是额外的工作,除非你指定一个模板,或者需要使用build立在模板上的东西,比如迭代一个IEnumerable<T>
。 创build模板非常简单,并且可以提供很大的灵活性。 在您的视图文件夹中为当前控制器(或共享视图文件夹)创build一个名为DisplayTemplates
文件夹。 在该文件夹中,使用要为其构build模板的模型types添加部分视图。 在这种情况下,我添加/Views/Shared/DisplayTemplates
并添加了一个名为ShortDateTime.cshtml
的部分视图。
@model System.DateTime @Model.ToShortDateString()
现在,您可以使用以下行来调用该模板:
@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")
你可以使用[DisplayFormat]
属性来修饰你的视图模型属性:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime MyDateTime { get; set; }
并在你看来:
@Html.EditorFor(x => x.MyDate)
或者,为了显示该值,
@Html.DisplayFor(x => x.MyDate)
另一种我不推荐的方法是使用弱types的帮手:
@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())
模型内部简单的格式化输出
@String.Format("{0:d}", model.CreatedOn)
或者在foreach循环中
@String.Format("{0:d}", item.CreatedOn)
我使用以下方法来内联格式并显示模型中的date属性。
@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")
否则,在填充文本框或编辑器时,您可以像@Darinbuild议的那样做,使用[DisplayFormat]
属性修饰属性。
如果所有的DateTime
types都以相同的方式呈现,则可以使用自定义的DateTime
显示模板。
在您的视图文件夹中创build一个名为“DisplayTemplates”在您的控制器特定的视图文件夹,或在“共享”文件夹(这些工作类似于偏见)下的文件夹。
在里面创build一个名为DateTime.cshtml
的文件,它将DateTime
作为@model
并且代码如何呈现date:
@model System.DateTime @Model.ToLongDateString()
现在你可以在你的意见中使用它,它应该工作:
@Html.DisplayFor(mod => mod.MyDateTime)
只要按照惯例将其添加到“DisplayTemplates”文件夹中,并命名该文件以匹配您所显示的types,MVC将自动使用该文件显示您的值。 这也适用于使用“EditorTemplates”编辑场景。
以下是关于模板的更多信息 。
我的首选是保持格式的细节与视图,而不是视图模型。 所以在MVC4 / Razor中:
@Html.TextBoxFor(model => model.DateTime, "{0:d}");
date时间格式参考: http : //msdn.microsoft.com/en-us/library/az4se3k1( v=vs.71) .aspx
然后我有一个JQuerydateselect器绑定到它,并把date作为一个不同的格式… 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") }); });
这有点弱,但应该涵盖很多案例。
为我工作
<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>
最近有同样的问题。
我发现在模型中简单地将DataType定义为Date也是可行的 (使用Code First方法)
[DataType(DataType.Date)] public DateTime Added { get; set; }
如果我只是想以短格式显示date,我只是使用@ Model.date.ToShortDateString(),它打印date
如果您只想以特定的格式显示date,请致电:
@Model.LeadDate.ToString("dd-MMM-yyyy") @Model.LeadDate.ToString("MM/dd/yy")
这将导致以下格式,
26-Apr-2013 04/26/13
这将在您的视图中以dd/MM/yyyy
格式显示
在视图中:
而不是DisplayFor
使用此代码
<td> @(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty") </td
它还检查date列中的值是否为空,如果为true,那么它将显示date为空或来自列的实际格式化date。
希望有助于某人。
@{ string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy"); @datein }
在MVC5中,我会使用,如果你的模型是date时间
string dt = Model.ToString("dd/MM/yyy");
或者如果你的模型包含date时间的属性
string dt = Model.dateinModel.ToString("dd/MM/yyy");
格式的官方含义如下:
https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
你可以这样做@ item.Date.Value.Tostring(“dd-MMM-yy”);
只有查看文件像这样调整。 你可以试试这个。
@Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)), "{0: yyyy-MM-dd}")
item.transdate
它是你的DateTime
types数据。