如果我在我的模型类中有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
参数。
如果您只想显示具有特定格式的日期,只需致电:
@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")
如果我只想以短格式显示日期,我只需使用@ Model.date.ToShortDateString()并打印日期
如果您只想显示具有特定格式的日期,只需致电:
@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
它还检查日期列中的值是否为null,如果为true,则它将显示Date is Empty或列中的实际格式化日期。
希望帮助某人。
@{
string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");
@datein
}
在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
仅查看文件调整如下。你可以试试这个。
@Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)),
"{0: yyyy-MM-dd}")
item.transdate
它是你的DateTime
类型数据。
您可以使用[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())
模型内部的简单格式化输出
@String.Format("{0:d}", model.CreatedOn)
或者在foreach循环中
@String.Format("{0:d}", item.CreatedOn)
我使用以下方法内联格式并从模型中显示日期属性。
@Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}")
否则,在填充TextBox或Editor时,您可以像@Darin建议一样,使用[DisplayFormat]
属性修饰属性。
如果所有DateTime
类型的渲染方式与使用自定义DateTime
显示模板的方式相同。
在Views文件夹中,在控制器特定视图文件夹下或“共享”文件夹下创建名为“DisplayTemplates”的文件夹(这些工作类似于partials)。
在里面创建一个名为DateTime.cshtml
的文件,它将DateTime
作为@model
并编码你想要如何呈现你的日期:
@model System.DateTime
@Model.ToLongDateString()
现在你可以在你的视图中使用它,它应该工作:
@Html.DisplayFor(mod => mod.MyDateTime)
只要遵循将其添加到“DisplayTemplates”文件夹并将文件命名为与您显示的类型相匹配的惯例,MVC将自动使用它来显示您的值。这也适用于使用“EditorTemplates”编辑场景。
我的首选是将格式详细信息保留在视图中而不是视图模型中。所以在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")
});
});
这有点弱,但应该涵盖很多案例。
适合我
<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>
最近有同样的问题。
我发现在模型中简单地将DataType定义为Date也可以使用(使用Code First方法)
[DataType(DataType.Date)]
public DateTime Added { get; set; }
你可以这样做@item.Date.Value.Tostring("dd-MMM-yy");